{"version":3,"sources":["jsdelivr-header.js","/npm/acaland-lib/src/lib/_store/subdivision/subdivision.actions.ts","/npm/acaland-lib/src/lib/_store/subdivision/subdivision.calculator.ts","/npm/acaland-lib/src/lib/_store/subdivision/subdivision.reducers.ts","/npm/acaland-lib/src/lib/acaland-layout.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/add-project/add-project.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/add-project/add-project.component.html","/npm/acaland-lib/src/lib/pages/land-development/building-data-viewer/building-data-viewer.component.ts","/npm/acaland-lib/src/lib/pages/land-development/building-data-viewer/building-data-viewer.component.html","/npm/acaland-lib/src/lib/pages/compliance-checklists/compliance-checklists.component.ts","/npm/acaland-lib/src/lib/pages/compliance-checklists/compliance-checklists.component.html","/npm/node_modules/tslib/tslib.es6.js","/npm/acaland-lib/src/lib/pages/site-detail/site-detail.component.ts","/npm/acaland-lib/src/lib/pages/site-detail/site-detail.component.html","/npm/acaland-lib/src/lib/pages/land-table-dashboard/land-table-dashboard.component.ts","/npm/acaland-lib/src/lib/pages/land-table-dashboard/land-table-dashboard.component.html","/npm/acaland-lib/src/lib/pages/dashboard/dashboard.component.ts","/npm/acaland-lib/src/lib/pages/dashboard/dashboard.component.html","/npm/acaland-lib/src/lib/pages/land-development/design-params-viewer/design-params-viewer.component.ts","/npm/acaland-lib/src/lib/pages/land-development/design-params-viewer/design-params-viewer.component.html","/npm/acaland-lib/src/lib/pages/land-development/documents/documents.component.ts","/npm/acaland-lib/src/lib/pages/land-development/documents/documents.component.html","/npm/acaland-lib/src/lib/_models/aucklandUnitaryPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/bayOfPlentyPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/canterburyPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/franklinPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/gisbornePlanZones.model.ts","/npm/acaland-lib/src/lib/_models/hawkesBayPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/manawatuWanganuiPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/marlboroughPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/northlandPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/otagoPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/ruapehuPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/southWaikatoPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/taranakiPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/taurangaPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/waikatoPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/wellingtonPlanZones.model.ts","/npm/acaland-lib/src/lib/_models/westCoastPlanZones.model.ts","/npm/acaland-lib/src/lib/_services/postcode.service.ts","/npm/acaland-lib/src/lib/_store/subdivision/subdivision-utilities.class.ts","/npm/acaland-lib/src/lib/_services/site-cache-manager.service.ts","/npm/acaland-lib/src/lib/_services/three-content.service.ts","/npm/acaland-lib/src/lib/_components/map/map.component.ts","/npm/acaland-lib/src/lib/_components/3dmap/map-viewer.component.ts","/npm/acaland-lib/src/lib/_components/3dmap/map-viewer.component.html","/npm/acaland-lib/src/lib/pages/land-development/site-subdivision-map/site-subdivision-map.component.ts","/npm/acaland-lib/src/lib/pages/land-development/site-subdivision-map/site-subdivision-map.component.html","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/subdivision-calculation-result.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/subdivision-calculation-result.component.html","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-analysis/subdivision-calculation-analysis.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-analysis/subdivision-calculation-analysis.component.html","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-detail.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-detail.component.html","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation.component.ts","/npm/acaland-lib/src/lib/pages/land-development/subdivision-calculation/subdivision-calculation.component.html","/npm/acaland-lib/src/lib/pages/land-development/property-parcel-data-viewer/property-parcel-data-viewer.component.ts","/npm/acaland-lib/src/lib/pages/land-development/property-parcel-data-viewer/property-parcel-data-viewer.component.html","/npm/acaland-lib/src/lib/pages/land-development/topo-data-viewer/topo-data-viewer.component.ts","/npm/acaland-lib/src/lib/pages/land-development/topo-data-viewer/topo-data-viewer.component.html","/npm/acaland-lib/src/lib/pages/land-development/site-adjoin/site-adjoin.component.ts","/npm/acaland-lib/src/lib/pages/land-development/site-adjoin/site-adjoin.component.html","/npm/acaland-lib/src/lib/pages/land-development/land-development.component.ts","/npm/acaland-lib/src/lib/pages/land-development/land-development.component.html","/npm/acaland-lib/src/lib/_components/polygon/polygon.component.ts","/npm/acaland-lib/src/lib/_components/polygon/polygon.component.html","/npm/acaland-lib/src/lib/pages/settings/settings.component.ts","/npm/acaland-lib/src/lib/pages/settings/settings.component.html","/npm/acaland-lib/src/lib/pages/land-development/contacts/contacts.component.ts","/npm/acaland-lib/src/lib/pages/land-development/contacts/contacts.component.html","/npm/acaland-lib/src/lib/acaland.module.ts"],"names":[],"mappings":"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","file":"/npm/@cas-hub/acaland-client@1.0.442/bundles/cas-hub-acaland-client.umd.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@cas-hub/acaland-client@1.0.442/bundles/cas-hub-acaland-client.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import {createAction, props} from '@ngrx/store';\nimport {\n    GenericKeyedPair,\n    LandBuildingInfo,\n    LandPropertyParcelInfo,\n    LandTopoInfo,\n    SubDivisionCalculationOutput,\n} from '@cas-hub/acabim-common-client';\nimport {AuditResultData, DetailedSite} from '../../_models/subdivision-calculation.model';\n\nexport const getSubdivision = createAction(\n    '[Sub-Division Calculator] Get sub-division calculations'\n);\n\nexport const onSubdivision = createAction(\n    '[Sub-Division Calculator] Get sub-division calculations success'\n);\n\nexport const onDefaults = createAction(\n    '[Sub-Division Calculator] Get sub-division defaults',\n    props<{ defaults: SubDivisionCalculationOutput }>()\n);\n\nexport const onSectionSize = createAction(\n    '[Sub-Division Calculator] on section size',\n    props<{ size: number }>()\n);\n\nexport const onSectionCoordinates = createAction(\n  '[Sub-Division Calculator] on section coordinates',\n  props<{\n      coordinates: [][],\n      area: number\n  }>()\n);\n\n\nexport const onSections = createAction(\n    '[Sub-Division Calculator] on sections',\n    props<{ sections: DetailedSite[] }>()\n);\n\nexport const onSingleSection = createAction(\n    '[Sub-Division Calculator] on add new section/site',\n    props<{ section: DetailedSite }>()\n);\n\nexport const onNoSite = createAction(\n    '[Sub-Division Calculator] on nulling the primary site'\n);\n\nexport const onPrimarySite = createAction(\n    '[Sub-Division Calculator] on setting a primary site',\n    props<{ site: DetailedSite }>()\n);\n\nexport const onDeleteSite = createAction(\n    '[Sub-Division Calculator] on delete section/site',\n    props<{ section: DetailedSite }>()\n);\n\nexport const onSectionPerimeter = createAction(\n    '[Sub-Division Calculator] on section perimeter',\n    props<{ sectionPerimeter: number }>()\n);\n\n\nexport const onSectionPurchasePrice = createAction(\n    '[Sub-Division Calculator] on section purchase price',\n    props<{ sectionPurchasePrice: number }>()\n);\n\nexport const onZone = createAction(\n    '[Sub-Division Calculator] on zone',\n    props<{ zone: GenericKeyedPair | null }>()\n);\n\nexport const onRegion = createAction(\n    '[Sub-Division Calculator] on region',\n    props<{ region: string | null }>()\n);\n\nexport const onOutdoorLivingArea = createAction(\n    '[Sub-Division Calculator] on outdoor living area CAP',\n    props<{ outdoorLivingArea: number }>()\n);\n\nexport const onNumberOfStoreys = createAction(\n    '[Sub-Division Calculator] on number of storeys',\n    props<{ numberOfStoreys: number }>()\n);\n\nexport const onNumberOfSubDivisions = createAction(\n    '[Sub-Division Calculator] on number of sub-divisions',\n    props<{ numberOfSubDivisions: number }>()\n);\n\nexport const onConstructionCost = createAction(\n    '[Sub-Division Calculator] on construction cost',\n    props<{ constructionCost: number }>()\n);\n\nexport const onSecondTierFinancing = createAction(\n    '[Sub-Division Calculator] on second-tier financing',\n    props<{ secondTierFinancing: number }>()\n);\n\nexport const onSecondTierValue = createAction(\n    '[Sub-Division Calculator] on second-tier value',\n    props<{ secondTierValue: number }>()\n);\n\nexport const onSecondTierInterest = createAction(\n    '[Sub-Division Calculator] on second-tier interest',\n    props<{ secondTierInterest: number }>()\n);\n\nexport const onBuildingCoverageRatio = createAction(\n    '[Sub-Division Calculator] on building coverage ratio',\n    props<{ buildingCoverageRatio: number}>()\n);\n\nexport const onLandscapedAreaRatio = createAction(\n    '[Sub-Division Calculator] on landscaped area ratio',\n    props<{ landscapedAreaRatio: number}>()\n);\n\nexport const onExpectedSalePrice = createAction(\n    '[Sub-Division Calculator] on expected sale price',\n    props<{ expectedSalePrice: number}>()\n);\n\nexport const onBoundarySetback = createAction(\n    '[Sub-Division Calculator] on boundary setback'\n);\n\nexport const onSalesCommission = createAction(\n    '[Sub-Division Calculator] on sales commission',\n    props<{ salesCommission: number}>()\n);\n\nexport const onAgentPercentage = createAction(\n    '[Sub-Division Calculator] on agent percentage',\n    props<{ agentPercentage: {name: string, value: number} }>()\n);\n\nexport const onCapParameters = createAction(\n    '[Sub-Division Calculator] on CAP parameters',\n    props<{cap: AuditResultData[]}>()\n);\n\nexport const onLandInformation = createAction(\n    '[Sub-Division Calculator] on land information',\n    props<{landInfo: LandPropertyParcelInfo}>()\n);\n\nexport const onLandBuildingInfo = createAction(\n    '[Sub-Division Calculator] on land building information',\n    props<{landBuildingInfo: LandBuildingInfo}>()\n);\n\nexport const onLandTopoInfo = createAction(\n    '[Sub-Division Calculator] on land topography information',\n    props<{landTopoInfo: LandTopoInfo}>()\n);\n\nexport const onCalculations = createAction(\n    '[Sub-Division Calculator] on all calculated values'\n);\n\nexport const calculateSectionPurchasePrice = createAction(\n    '[Sub-Division Calculator] on section purchase price'\n);\n\nexport const onAverageFloorArea = createAction(\n    '[Sub-Division Calculator] on average floor area',\n    props<{averageFloorArea: number}>()\n);\n\n// EOF\n","import {\n    AuditResultData,\n    ComplianceParameter,\n    DetailedSite, RegionParameters, SubDivFinancialParams, SubdivisionCalculationModel, SubDivNumberParams\n} from '../../_models/subdivision-calculation.model';\nimport {AcabimSite} from '@cas-hub/acabim-common-client';\n\nexport class SubdivisionCalculator {\n\n    public static calculateTotalFloorArea = (numberOfSubDivisions: number, averageFloorArea: number, numberOfStoreys: number) => {\n            return numberOfSubDivisions * averageFloorArea * numberOfStoreys;\n    }\n\n    public static calculateOutdoorLivingArea = (numberOfSubDivisions: number, outdoorLivingArea: number) => {\n        if (numberOfSubDivisions < 1) {\n            return outdoorLivingArea ?? 20;\n        }\n        return numberOfSubDivisions * (outdoorLivingArea ?? 20);\n    }\n\n    public static calculateMaxBuildingCoverage = (siteArea: number, state: SubdivisionCalculationModel) => {\n        return (state.cap?.buildingCoverageRatio) ? Math.floor(siteArea * (state.cap?.buildingCoverageRatio ?? 1)) : 0;\n    }\n\n    public static calculateLandscapedArea = (siteArea: number, state: SubdivisionCalculationModel) => {\n        return (state.cap?.landscapedAreaRatio) ? Math.ceil(siteArea * (state.cap?.landscapedAreaRatio ?? 1)) : 0;\n    }\n\n    public static calculateNumberOfSubdivisions = (\n        siteArea: number,\n        state: SubdivisionCalculationModel\n    ): {final: number; data: SubDivNumberParams} => {\n        // const effectiveLotArea = ((state.averageFloorArea ?? 0) * 1.1) + (state.outdoorLivingArea ?? 0);\n        const effectiveLotArea = ((state.averageFloorArea ?? 0) * 1.1);\n        const buildingCoverageArea = SubdivisionCalculator.calculateMaxBuildingCoverage(siteArea, state);\n        const landscapedArea = SubdivisionCalculator.calculateLandscapedArea(siteArea, state);\n        const numberOfSubdivisions1 = Math.floor(buildingCoverageArea / ((state.averageFloorArea ?? 0) * 1.1));\n        const boundarySetbackAdj = (state.boundarySetback ?? 0) * -1.1;\n        const effectiveSiteArea = siteArea + ((state.sectionPerimeter ?? 0) * boundarySetbackAdj + Math.PI * boundarySetbackAdj * boundarySetbackAdj);\n        let numberOfSubdivisions2 = 0;\n        const effectivePerimeter = (state.sectionPerimeter ?? 0) + 2 * Math.PI * boundarySetbackAdj;\n        if (state.selectedSiteObjects?.length === 1) {\n            numberOfSubdivisions2 = Math.ceil(effectiveSiteArea / (effectiveLotArea * 1.1));\n        } else {\n            numberOfSubdivisions2 = Math.ceil(0.85 * (buildingCoverageArea + landscapedArea) / (effectiveLotArea * 1.1));\n        }\n        const final =  numberOfSubdivisions1 > numberOfSubdivisions2 ? numberOfSubdivisions2 : numberOfSubdivisions1;\n        // const buildingFootprint = (effectiveLotArea * final);\n        // const developmentExtent = (buildingFootprint + (state.outdoorLivingArea ?? 0));\n        return {\n            final,\n            data: {\n                averageFloorArea: state.averageFloorArea,\n                boundarySetback: state.boundarySetback ?? 0,\n                boundarySetbackAdj,\n                buildingCoverageArea,\n                // buildingFootprint,\n                capBuildingCoverageRatio: state.cap?.buildingCoverageRatio ?? 0,\n                capLandscapedAreaRatio: state.cap?.landscapedAreaRatio ?? 0,\n                // developmentExtent,\n                effectiveLotArea,\n                effectiveSiteArea,\n                effectivePerimeter,\n                landscapedArea,\n                numberOfSubdivisions1,\n                numberOfSubdivisions2,\n                numberOfSubdivisionsFinal: final,\n                outdoorLivingArea: state.outdoorLivingArea ?? 0,\n                sectionPerimeter: state.sectionPerimeter ?? 0,\n                siteArea,\n            }\n        };\n    }\n\n    static calculateSectionArea = (sites?: AcabimSite[]) => {\n        let sectionArea = 0;\n        if (sites && sites.length > 0) {\n            sites.forEach(site => {\n                if (site.area) {\n                    sectionArea = sectionArea + site.area;\n                } else {\n                    // what do we do here?\n                }\n            });\n        }\n        return sectionArea;\n    }\n\n    static calculateSectionPerimeter = (sites?: AcabimSite[]) => {\n        let sectionPerimeter = 0;\n        if (sites && sites.length > 0) {\n            sites.forEach(site => {\n                sectionPerimeter = sectionPerimeter + +site.perimeter;\n            });\n        }\n        return sectionPerimeter;\n    }\n\n    public static calculateBoundarySetback = (rearSetback: number, sideSetback: number, frontSetback: number) => {\n        return Math.min(rearSetback, sideSetback, frontSetback);\n    }\n\n    public static calculateSectionPurchasePrice = (squareMetreCost: number, sectionSize: number) => {\n        return squareMetreCost * sectionSize;\n    }\n\n    public static calculateAgentCommission = (agentPercentage: number, expectedSalePrice: number, numberOfSubdivisions: number) => {\n        return Math.floor(agentPercentage * expectedSalePrice * numberOfSubdivisions);\n    }\n\n    public static calculateProfessionalFee = (constructionCost: number, professionalFee: number) => {\n        return Math.floor(professionalFee * constructionCost);\n    }\n\n    public static calculateCommission = (agentPercentage: {name: string, value: number}, expectedSalePrice: number, numberOfSubdivisions: number) => {\n        return Math.floor(agentPercentage.value * expectedSalePrice * numberOfSubdivisions);\n    }\n\n    // HANDLERS\n    public static handleRegionParameters = (regionKey: string) => {\n        let final: RegionParameters = {\n            squareMetreCost: 0,\n            constructionCost: 0,\n            professionalFee: 0,\n            defaultProfessionalFee: 0\n        };\n        switch (regionKey) {\n            case 'AUK':\n                final = {\n                    squareMetreCost: 2850,\n                    constructionCost: 3200,\n                    professionalFee: 0.073\n                };\n                break;\n            case 'BOP':\n                final = {\n                    squareMetreCost: 2600,\n                    constructionCost: 2800,\n                    professionalFee: 0.065\n                };\n                break;\n            case 'CAN':\n                final = {\n                    squareMetreCost: 1600,\n                    constructionCost: 2400,\n                    professionalFee: 0.055\n                };\n                break;\n            case 'GIS':\n                final = {\n                    squareMetreCost: 1920,\n                    constructionCost: 2600,\n                    professionalFee: 0.062\n                };\n                break;\n            case 'HKB':\n                final = {\n                    squareMetreCost: 1920,\n                    constructionCost: 2600,\n                    professionalFee: 0.068\n                };\n                break;\n            case 'MWT':\n                final = {\n                    squareMetreCost: 2000,\n                    constructionCost: 2600,\n                    professionalFee: 0.072\n                };\n                break;\n            case 'MBH':\n                final = {\n                    squareMetreCost: 2100,\n                    constructionCost: 2850,\n                    professionalFee: 0.072\n                };\n                break;\n            case 'NTL':\n                final = {\n                    squareMetreCost: 1600,\n                    constructionCost: 2200,\n                    professionalFee: 0.055\n                };\n                break;\n            case 'OTA':\n                final = {\n                    squareMetreCost: 1600,\n                    constructionCost: 2400,\n                    professionalFee: 0.055\n                };\n                break;\n            case 'RPH':\n                final = {\n                    squareMetreCost: 2000,\n                    constructionCost: 2600,\n                    professionalFee: 0.065\n                };\n                break;\n            case 'SWK':\n                final = {\n                    squareMetreCost: 1850,\n                    constructionCost: 2500,\n                    professionalFee: 0.066\n                };\n                break;\n            case 'TKI':\n                final = {\n                    squareMetreCost: 1800,\n                    constructionCost: 2800,\n                    professionalFee: 0.068\n                };\n                break;\n            case 'TRG':\n                final = {\n                    squareMetreCost: 2200,\n                    constructionCost: 3000,\n                    professionalFee: 0.068\n                };\n                break;\n            case 'WKO':\n                final = {\n                    squareMetreCost: 2100,\n                    constructionCost: 2850,\n                    professionalFee: 0.066\n                };\n                break;\n            case 'WGN':\n                final = {\n                    squareMetreCost: 1900,\n                    constructionCost: 3000,\n                    professionalFee: 0.082\n                };\n                break;\n            case 'WTC':\n                final = {\n                    squareMetreCost: 1750,\n                    constructionCost: 2000,\n                    professionalFee: 0.055\n                };\n                break;\n            default:\n                break;\n        }\n        final.defaultProfessionalFee = Math.floor(final.professionalFee * final.constructionCost);\n        return final;\n    }\n\n    static handleNewSection = (newSection: DetailedSite, existingSections?: DetailedSite[]) => {\n        const allSections: DetailedSite[] = [];\n        allSections.push(newSection);\n        if (existingSections && existingSections.length > 0) {\n            existingSections.map(section => {\n                if (newSection.core.id !== section.core.id) {\n                    allSections.push(section);\n                }\n            });\n        }\n        return allSections;\n    }\n\n    static handleRemoveSection = (exitingSection: DetailedSite, existingSections?: DetailedSite[]) => {\n        const allSections: DetailedSite[] = [];\n        if (existingSections && existingSections.length > 0) {\n            existingSections.map(section => {\n                if (exitingSection.core.id !== section.core.id) {\n                    allSections.push(section);\n                }\n            });\n        }\n        return allSections;\n    }\n\n    static handleSectionCoordinates = (existingSections?: DetailedSite[]) => {\n        const allCoordinates: number[][][] = [];\n        if (existingSections && existingSections?.length > 0) {\n            existingSections.map(section => {\n                if (section.core && section.core.coordinates) {\n                    allCoordinates.push(section.core.coordinates);\n                }\n            });\n        }\n        return allCoordinates;\n    }\n\n    public static packageCapParameters = (capParameters: AuditResultData[]) => {\n        const final: ComplianceParameter = {\n            buildingsPerSite: SubdivisionCalculator.handleCapResultData(capParameters, 'BuildingsPerSite') as number,\n            landscapedAreaRatio: SubdivisionCalculator.handleCapResultData(capParameters, 'LandscapedAreaRatio') as number,\n            impermeableAreaRatio: SubdivisionCalculator.handleCapResultData(capParameters, 'ImpermeableAreaRatio') as number,\n            rearClearance: SubdivisionCalculator.handleCapResultData(capParameters, 'RearClearance') as number,\n            sideClearance: SubdivisionCalculator.handleCapResultData(capParameters, 'SideClearance') as number,\n            frontClearance: SubdivisionCalculator.handleCapResultData(capParameters, 'FrontClearance') as number,\n            outdoorLivingArea: SubdivisionCalculator.handleCapResultData(capParameters, 'OutdoorLivingArea') as number,\n            buildingCoverageRatio: SubdivisionCalculator.handleCapResultData(capParameters, 'BuildingCoverageRatio') as number,\n            maxParkingRate: SubdivisionCalculator.handleCapResultData(capParameters, 'maxParkingRate') as number,\n            lrmlRuleId1: SubdivisionCalculator.handleCapResultData(capParameters, 'LrmlRuleId1', 'string') as string,\n            lrmlRuleId2: SubdivisionCalculator.handleCapResultData(capParameters, 'LrmlRuleId2', 'string') as string,\n            zone: SubdivisionCalculator.handleCapResultData(capParameters, 'Zone', 'string') as string,\n        };\n        return final;\n    }\n\n    static packageFinancialParams = (state: SubdivisionCalculationModel) => {\n        const result: SubDivFinancialParams = {\n            agentFeeValue: state.agentFee?.value ?? 0,\n            constructionCost: state.constructionCost ?? 0,\n            expectedSalePrice: state.expectedSalePrice ?? 0,\n            numberOfSubdivisions: state.numberOfSubdivisions ?? 1,\n            professionalFee: state.professionalFee ?? 0,\n            regionalDefaultProfessionalFee: state.regionalDefaultProfessionalFee ?? 0,\n            regionalProfessionalFee: state.regionalProfessionalFee ?? 0,\n            saleCommission: state.saleCommission ?? 0,\n            secondTierFinancing: state.secondTierFinancing ?? 0,\n            secondTierInterest: state.secondTierInterest ?? 0,\n            secondTierValue: state.secondTierValue ?? 0,\n            sectionPurchasePrice: state.sectionPurchasePrice ?? 0,\n            sectionSize: state.sectionSize ?? 0,\n            squareMetreCost: state.squareMetreCost ?? 0,\n        };\n        return result;\n    }\n\n    private static handleCapResultData = (capParameters: AuditResultData[], paramName: string, paramType: string = 'number') => {\n        if (paramType === 'number') {\n            return capParameters.filter(cp => cp.name === paramName).map(param => param.result as number)[0];\n        } else {\n            return capParameters.filter(cp => cp.name === paramName).map(param => param.result as string)[0];\n        }\n    }\n\n} // EOC\n","import { createReducer, on } from '@ngrx/store';\nimport * as SubdivisionActions from './subdivision.actions';\nimport {\n    ComplianceParameter,\n    RegionParameters,\n    SubdivisionCalculationModel,\n} from '../../_models/subdivision-calculation.model';\nimport {SubdivisionCalculator} from './subdivision.calculator';\n\nexport const initialState: SubdivisionCalculationModel = {\n    agentFee: { name: '3%', value: 0.03},\n    averageFloorArea: 50,\n    buildingCoverageArea: 0,\n    constructionCost: 2750,\n    expectedSalePrice: 1200000,\n    landscapedArea: 0,\n    numberOfStoreys: 1,\n    numberOfSubdivisions: 1,\n    outdoorLivingArea: 20,\n    professionalFee: 150,\n    saleCommission: 1000,\n    secondTierFinancing: 60,\n    secondTierInterest: 10,\n    secondTierValue: 1200000,\n    sectionPurchasePrice: 1000000,\n    sectionSize: 0,\n    totalFloorArea: 0\n};\n\nexport const subdivisionReducer = createReducer(\n    initialState,\n    on(SubdivisionActions.getSubdivision, state => state),\n    on(SubdivisionActions.onSubdivision, state => state),\n    on(SubdivisionActions.onDefaults, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            agentFee: props.defaults.agentFee,\n            averageFloorArea: props.defaults.averageFloorArea,\n            buildingCoverageArea: props.defaults.buildingCoverageArea,\n            constructionCost: props.defaults.constructionCost,\n            expectedSalePrice: props.defaults.expectedSalePrice,\n            landscapedArea: props.defaults.landscapedArea,\n            // impermeableArea: props.defaults.impermeableArea,\n            numberOfStoreys: props.defaults.numberOfStoreys,\n            numberOfSubdivisions: props.defaults.numberOfSubdivisions,\n            outdoorLivingArea: props.defaults.outdoorLivingArea,\n            professionalFee: props.defaults.professionalFee,\n            saleCommission: props.defaults.saleCommission,\n            secondTierFinancing: props.defaults.secondTierFinancing,\n            secondTierInterest: props.defaults.secondTierInterest,\n            secondTierValue: props.defaults.secondTierValue,\n            sectionPurchasePrice: props.defaults.sectionPurchasePrice,\n            sectionSize: props.defaults.sectionSize,\n            totalFloorArea: props.defaults.totalFloorArea,\n        };\n    }),\n    // Location\n    on(SubdivisionActions.onRegion, (state: SubdivisionCalculationModel, props) => {\n        if (!props.region) {\n            return {\n                ...state,\n                regionKey: undefined,\n                zoneKey: undefined,\n                zoneValue: undefined,\n                cap: undefined,\n                squareMetreCost: undefined,\n                constructionCost: undefined,\n                regionalProfessionalFee: undefined,\n                professionalFee: undefined,\n                financialParams: undefined,\n            };\n        }\n        const regionParams: RegionParameters = SubdivisionCalculator.handleRegionParameters(props.region);\n        return {\n            ...state,\n            regionKey: props.region ?? undefined,\n            squareMetreCost: regionParams.squareMetreCost,\n            constructionCost: regionParams.constructionCost,\n            regionalProfessionalFee: regionParams.professionalFee,\n            professionalFee: regionParams.defaultProfessionalFee,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onZone, (state: SubdivisionCalculationModel, props) => {\n        const zone = props.zone;\n        if (!zone) {\n            return {\n                ...state,\n                zoneKey: undefined,\n                zoneValue: undefined,\n                cap: undefined,\n            };\n        }\n        return {\n            ...state,\n            zoneKey: zone?.key,\n            zoneValue: zone?.value,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    // Sites/Sections\n    on(SubdivisionActions.onSections, (state: SubdivisionCalculationModel, props) => {\n        const sectionSize =  SubdivisionCalculator.calculateSectionArea(props.sections.map(section => section.core));\n        const sectionPerimeter =  SubdivisionCalculator.calculateSectionPerimeter(props.sections.map(section => section.core));\n        const newState: SubdivisionCalculationModel = {\n            ...state,\n            sectionSize,\n            sectionPerimeter\n        };\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(sectionSize, newState);\n        return {\n            ...state,\n            numberOfSubdivisions: subDivs.final ?? 0,\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionPerimeter,\n            sectionPurchasePrice: (1000000 * props.sections.length),\n            sectionSize,\n            selectedSiteObjects: props.sections,\n            selectedSites: props.sections.map(section => section.core.id),\n            subDivisionParams: subDivs.data,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onNoSite, (state: SubdivisionCalculationModel) => {\n        return {\n            ...initialState,\n            agentCommission: 0,\n            boundarySetback: 0,\n            buildingCoverageRatio: 0,\n            cap: undefined,\n            constructionCostPerMetre: 0,\n            financialParams: undefined,\n            floorAreaPerStorey: 0,\n            impermeableArea: 0,\n            impermeableAreaRatio: 0,\n            landscapedAreaRatio: 0,\n            linz: {property: undefined, building: undefined, topography: undefined},\n            outdoorLivingAreaCap: 0,\n            primarySite: undefined,\n            propertyPurchasePrice: 0,\n            propertyValueForSecondTier: 0,\n            regionKey: undefined,\n            regionalDefaultProfessionalFee: 0,\n            regionalProfessionalFee: 0,\n            sectionCoordinates: [],\n            sectionPerimeter: 0,\n            selectedSiteObjects: [],\n            selectedSites: [],\n            siteCoordinates: [],\n            squareMetreCost: undefined,\n            subDivisionParams: undefined,\n            zoneKey: undefined,\n            zoneValue: undefined,\n        };\n    }),\n    on(SubdivisionActions.onPrimarySite, (state: SubdivisionCalculationModel, props) => {\n        // we reset the number of sections when we choose a new primary site\n        const allSections = SubdivisionCalculator.handleNewSection(props.site, []);\n        const sectionSize = SubdivisionCalculator.calculateSectionArea(allSections.map(section => section.core));\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(sectionSize, state);\n        const newState: SubdivisionCalculationModel = {\n            ...state,\n            buildingCoverageArea: SubdivisionCalculator.calculateMaxBuildingCoverage(sectionSize, state),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state),\n            landscapedArea: SubdivisionCalculator.calculateLandscapedArea(sectionSize, state),\n            numberOfSubdivisions: subDivs.final ?? 0,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            primarySite: props.site,\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionCoordinates: SubdivisionCalculator.handleSectionCoordinates(allSections),\n            sectionPerimeter: SubdivisionCalculator.calculateSectionPerimeter(allSections.map(section => section.core)),\n            sectionPurchasePrice: (1000000 * allSections.length),\n            sectionSize,\n            selectedSiteObjects: allSections,\n            selectedSites: allSections.map(section => section.core.id),\n            subDivisionParams: subDivs.data,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n        };\n        return {\n            ...newState,\n            financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n        };\n    }),\n    on(SubdivisionActions.onSingleSection, (state: SubdivisionCalculationModel, props) => {\n        const allSections = SubdivisionCalculator.handleNewSection(props.section, state.selectedSiteObjects);\n        const sectionSize = SubdivisionCalculator.calculateSectionArea(allSections.map(section => section.core));\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(sectionSize, state);\n        const newState: SubdivisionCalculationModel = {\n            ...state,\n            buildingCoverageArea: SubdivisionCalculator.calculateMaxBuildingCoverage(sectionSize, state),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state),\n            landscapedArea: SubdivisionCalculator.calculateLandscapedArea(sectionSize, state),\n            numberOfSubdivisions: subDivs.final ?? 0,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionCoordinates: SubdivisionCalculator.handleSectionCoordinates(allSections),\n            sectionPerimeter: SubdivisionCalculator.calculateSectionPerimeter(allSections.map(section => section.core)),\n            sectionPurchasePrice: (1000000 * allSections.length),\n            sectionSize,\n            selectedSiteObjects: allSections,\n            selectedSites: allSections.map(section => section.core.id),\n            subDivisionParams: subDivs.data,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n        };\n        return {\n            ...newState,\n            financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n        };\n    }),\n    on(SubdivisionActions.onDeleteSite, (state: SubdivisionCalculationModel, props) => {\n        const allSections = SubdivisionCalculator.handleRemoveSection(props.section, state.selectedSiteObjects);\n        const sectionSize = SubdivisionCalculator.calculateSectionArea(allSections.map(section => section.core));\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(sectionSize, state);\n        const newState: SubdivisionCalculationModel = {\n            ...state,\n            buildingCoverageArea: SubdivisionCalculator.calculateMaxBuildingCoverage(sectionSize, state),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state),\n            landscapedArea: SubdivisionCalculator.calculateLandscapedArea(sectionSize, state),\n            numberOfSubdivisions: subDivs.final ?? 0,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionCoordinates: SubdivisionCalculator.handleSectionCoordinates(allSections),\n            sectionPerimeter: SubdivisionCalculator.calculateSectionPerimeter(allSections.map(section => section.core)),\n            sectionPurchasePrice: (1000000 * allSections.length),\n            sectionSize,\n            selectedSiteObjects: allSections,\n            selectedSites: allSections.map(section => section.core.id),\n            subDivisionParams: subDivs.data,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n        };\n        return {\n            ...newState,\n            financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n        };\n    }),\n  // Property Details\n  on(SubdivisionActions.onSectionCoordinates, (state: SubdivisionCalculationModel, props) => {\n\n      const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(props.area, state);\n      return {\n          ...state,\n          sectionCoordinates: props.coordinates,\n          buildingCoverageArea: SubdivisionCalculator.calculateMaxBuildingCoverage(props.area, state),\n          financialParams: SubdivisionCalculator.packageFinancialParams(state),\n          landscapedArea: SubdivisionCalculator.calculateLandscapedArea(props.area, state),\n          numberOfSubdivisions: subDivs.final ?? 0,\n          outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n          saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n          sectionSize: props.area,\n          subDivisionParams: subDivs.data,\n          totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n      };\n  }),\n    // Property Details\n    on(SubdivisionActions.onSectionSize, (state: SubdivisionCalculationModel, props) => {\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(props.size, state);\n        return {\n            ...state,\n            buildingCoverageArea: SubdivisionCalculator.calculateMaxBuildingCoverage(props.size, state),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state),\n            landscapedArea: SubdivisionCalculator.calculateLandscapedArea(props.size, state),\n            numberOfSubdivisions: subDivs.final ?? 0,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionSize: props.size,\n            subDivisionParams: subDivs.data,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n        };\n    }),\n    on(SubdivisionActions.onAverageFloorArea, (state: SubdivisionCalculationModel, props) => {\n        const newState: SubdivisionCalculationModel = {\n            ...state,\n            averageFloorArea: props.averageFloorArea\n        };\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(newState.sectionSize ?? 0, newState);\n        const newerState: SubdivisionCalculationModel = {\n            ...state,\n            averageFloorArea: props.averageFloorArea,\n            numberOfSubdivisions: subDivs.final,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, props.averageFloorArea, state.numberOfStoreys),\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            subDivisionParams: subDivs.data\n        };\n        return {\n            ...newerState,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onNumberOfSubDivisions, (state: SubdivisionCalculationModel, props) => {\n        const totalFloorArea = SubdivisionCalculator.calculateTotalFloorArea(props.numberOfSubDivisions, state.averageFloorArea, state.numberOfStoreys);\n        const outdoorLivingArea = SubdivisionCalculator.calculateOutdoorLivingArea(props.numberOfSubDivisions, state.cap?.outdoorLivingArea ?? 0);\n        return {\n            ...state,\n            numberOfSubdivisions: props.numberOfSubDivisions,\n            totalFloorArea,\n            outdoorLivingArea,\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, props.numberOfSubDivisions),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onNumberOfStoreys, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            numberOfStoreys: props.numberOfStoreys,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(state.numberOfSubdivisions ?? 1, state.averageFloorArea, props.numberOfStoreys),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onCalculations, (state: SubdivisionCalculationModel) => {\n        const buildingCoverageArea = (state.cap?.buildingCoverageRatio) ? Math.floor((state.sectionSize ?? 0) * (state.cap?.buildingCoverageRatio ?? 1)) : 0;\n        const landscapedArea = (state.cap?.landscapedAreaRatio) ? Math.ceil((state.sectionSize ?? 0) * (state.cap?.landscapedAreaRatio ?? 1)) : 0;\n        const sectionPurchasePrice = SubdivisionCalculator.calculateSectionPurchasePrice(state.squareMetreCost ?? 0, state.sectionSize ?? 0);\n        const workingState: SubdivisionCalculationModel = {\n            ...state,\n            buildingCoverageArea,\n            landscapedArea,\n            sectionPurchasePrice,\n            professionalFee: SubdivisionCalculator.calculateProfessionalFee(state.constructionCost ?? 0, state.regionalProfessionalFee ?? 0),\n        };\n        const subDivs = SubdivisionCalculator.calculateNumberOfSubdivisions(state.sectionSize ?? 0, workingState);\n        return {\n            ...state,\n            buildingCoverageArea,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state),\n            landscapedArea,\n            numberOfSubdivisions: subDivs.final ?? 0,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(subDivs.final, state.cap?.outdoorLivingArea ?? 0),\n            professionalFee: workingState.professionalFee,\n            saleCommission: SubdivisionCalculator.calculateAgentCommission(state.agentFee?.value ?? 0, state.expectedSalePrice ?? 0, subDivs.final),\n            sectionPurchasePrice,\n            subDivisionParams: subDivs.data,\n            totalFloorArea: SubdivisionCalculator.calculateTotalFloorArea(subDivs.final, state.averageFloorArea, state.numberOfStoreys),\n        };\n    }),\n    on(SubdivisionActions.calculateSectionPurchasePrice, (state: SubdivisionCalculationModel) => {\n        return {\n            ...state,\n            sectionPurchasePrice: SubdivisionCalculator.calculateSectionPurchasePrice(state.squareMetreCost ?? 0, state.sectionSize ?? 0),\n            professionalFee: SubdivisionCalculator.calculateProfessionalFee(state.constructionCost ?? 0, state.professionalFee ?? 0),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onSectionPurchasePrice, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            sectionPurchasePrice: props.sectionPurchasePrice,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onSectionPerimeter, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            sectionPerimeter: props.sectionPerimeter,\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    on(SubdivisionActions.onSecondTierValue, (state: SubdivisionCalculationModel, props) => {\n        const newState = {...state, secondTierValue: props.secondTierValue};\n        if (state.expectedSalePrice && state.numberOfSubdivisions) {\n            return {\n                ...state,\n                secondTierValue: props.secondTierValue,\n                financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n            };\n        }\n        return state;\n    }),\n    on(SubdivisionActions.onSecondTierFinancing, (state: SubdivisionCalculationModel, props) => {\n        const newState = {...state, secondTierFinancing: props.secondTierFinancing};\n        if (state.expectedSalePrice && state.numberOfSubdivisions) {\n            return {\n                ...state,\n                secondTierFinancing: props.secondTierFinancing,\n                financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n            };\n        }\n        return state;\n    }),\n    on(SubdivisionActions.onSecondTierInterest, (state: SubdivisionCalculationModel, props) => {\n        const newState = {...state, secondTierInterest: props.secondTierInterest};\n        if (state.expectedSalePrice && state.numberOfSubdivisions) {\n            return {\n                ...state,\n                secondTierInterest: props.secondTierInterest,\n                financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n            };\n        }\n        return state;\n    }),\n    on(SubdivisionActions.onAgentPercentage, (state: SubdivisionCalculationModel, props) => {\n        if (state.expectedSalePrice && state.numberOfSubdivisions) {\n            return {\n                ...state,\n                agentFee: props.agentPercentage,\n                saleCommission: SubdivisionCalculator.calculateCommission(props.agentPercentage, state.expectedSalePrice ?? 0, state.numberOfSubdivisions ?? 0),\n                financialParams: SubdivisionCalculator.packageFinancialParams(state)\n            };\n        }\n        return state;\n    }),\n    on(SubdivisionActions.onSalesCommission, (state: SubdivisionCalculationModel, props) => {\n        const newState = {...state, saleCommission: props.salesCommission};\n        if (state.expectedSalePrice && state.numberOfSubdivisions) {\n            return {\n                ...state,\n                saleCommission: props.salesCommission,\n                financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n            };\n        }\n        return state;\n    }),\n    on(SubdivisionActions.onExpectedSalePrice, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            expectedSalePrice: props.expectedSalePrice,\n            saleCommission: SubdivisionCalculator.calculateCommission(state.agentFee ?? {name: '', value: 0}, props.expectedSalePrice, state.numberOfSubdivisions ?? 0),\n            financialParams: SubdivisionCalculator.packageFinancialParams(state)\n        };\n    }),\n    // setConstructionCost\n    on(SubdivisionActions.onConstructionCost, (state: SubdivisionCalculationModel, props) => {\n        const newState = {...state, constructionCost: props.constructionCost};\n        return {\n            ...state,\n            constructionCost: props.constructionCost,\n            financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n        };\n    }),\n    on(SubdivisionActions.onCapParameters, (state: SubdivisionCalculationModel, props) => {\n        const cap: ComplianceParameter = SubdivisionCalculator.packageCapParameters(props.cap);\n        const newState = {...state, cap };\n        return {\n            ...state,\n            cap,\n            outdoorLivingArea: SubdivisionCalculator.calculateOutdoorLivingArea(state.numberOfSubdivisions ?? 1, cap?.outdoorLivingArea ?? 0),\n            boundarySetback: SubdivisionCalculator.calculateBoundarySetback(\n                cap?.rearClearance ?? 0,\n                cap?.sideClearance ?? 0,\n                cap?.frontClearance ?? 0\n            ),\n            financialParams: SubdivisionCalculator.packageFinancialParams(newState)\n        };\n    }),\n    on(SubdivisionActions.onLandInformation, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            linz: {\n                ...state.linz,\n                property: props.landInfo\n            }\n        };\n    }),\n    on(SubdivisionActions.onLandBuildingInfo, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            linz: {\n                ...state.linz,\n                building: props.landBuildingInfo\n            }\n        };\n    }),\n    on(SubdivisionActions.onLandTopoInfo, (state: SubdivisionCalculationModel, props) => {\n        return {\n            ...state,\n            linz: {\n                ...state.linz,\n                topography: props.landTopoInfo\n            }\n        };\n    })\n);\n","import {Component} from '@angular/core';\nimport {faDesktop, faCogs, faDrawPolygon, faTasks, faPaperclip, faAddressBook} from '@fortawesome/free-solid-svg-icons';\nimport {ModuleModel} from '@cas-hub/acabim-common-client';\n\n@Component({\n    template: `\n        <acabim-main-layout [navItems]=\"navItems\" [module]=\"module\"></acabim-main-layout>`\n})\nexport class AcaLandLayoutComponent {\n\n    public readonly module: ModuleModel = {\n        title: 'ACALand',\n        description: 'Land Development',\n        key: 'land',\n        topNav: true,\n        projectShow: true,\n        projectOpen: true,\n        projectSelect: true,\n        projectLabel: 'Project',\n        siteOnly: false,\n        hideSiteProjectOnInit: false\n    };\n\n    public navItems = [\n        {\n            title: 'Dashboard',\n            link: '/acaland/dashboard',\n            icon: faDesktop,\n            dividerBottom: true,\n            hideSiteProject: true\n        },\n        {\n            title: 'Land Development',\n            link: '/acaland/land-development',\n            icon: faDrawPolygon,\n            children: [\n                {\n                    title: 'Documents',\n                    link: '/acaland/land-development/documents',\n                    icon: faPaperclip,\n                },\n                {\n                    title: 'Contacts',\n                    link: '/acaland/land-development/contacts',\n                    icon: faAddressBook,\n                }\n            ]\n        },\n        {\n            title: 'Compliance Checklists',\n            icon: faTasks,\n            link: '/acaland/compliance-checklists',\n            dividerBottom: true,\n        },\n        {\n            title: 'Settings',\n            link: '/acaland/settings',\n            icon: faCogs,\n            dividerTop: false,\n            ghost: true,\n            children: [\n                {\n                    title: 'Admin space',\n                    link: '/admin'\n                },\n                {\n                    title: 'Manage Site and Project',\n                    link: '/admin/sites-projects'\n                }\n            ]\n        }\n    ];\n\n    constructor() {\n    }\n}\n","import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core';\nimport {\n    AcabimProjectCreateRequest,\n    ProjectApiService,\n    SubDivisionCalculation,\n    SubdivisionCalculationService\n} from '@cas-hub/acabim-common-client';\nimport {FormGroup, FormControl, Validators} from '@angular/forms';\nimport {Subscription} from 'rxjs';\n\n@Component({\n    selector: 'acaland-add-project',\n    templateUrl: './add-project.component.html',\n    styleUrls: []\n})\nexport class AddProjectComponent implements OnInit, OnDestroy {\n\n    @Input() siteId: string | null = null;\n    @Input() dataStore: SubDivisionCalculation | null = null;\n    @Output() public projectCreated = new EventEmitter<string>();\n\n    addProjectForm: FormGroup;\n    createdProject = false;\n    creatingProject = false;\n    done = false;\n    projectId: string | null = null;\n    projectName: string | null = null;\n    subdivisionSub: Subscription = new Subscription();\n\n    constructor(\n        private readonly projectApiService: ProjectApiService,\n        private readonly calculationService: SubdivisionCalculationService\n    ) {\n        this.projectId = null;\n        this.dataStore = null;\n        this.addProjectForm = new FormGroup({\n            projectName: new FormControl(null, Validators.required),\n            projectDescription: new FormControl()\n        });\n    }\n\n    ngOnInit(): void {\n    }\n\n    ngOnDestroy(): void {\n        this.subdivisionSub.unsubscribe();\n    }\n\n    closeModal(): void {\n        if (this.projectName) {\n            this.done = false;\n            this.createdProject = false;\n            this.projectCreated.emit(this.projectName);\n        }\n    }\n\n    addProject(): void {\n        this.creatingProject = true;\n        if (this.siteId !== null && this.dataStore !== null) {\n            const request: AcabimProjectCreateRequest = {\n                name: this.addProjectForm.get('projectName')?.value,\n                description: this.addProjectForm.get('projectDescription')?.value,\n                siteId: this.siteId,\n                projectGroupIds: []\n            };\n            this.projectApiService.createProject(request).subscribe(p => {\n                if (p !== null && this.dataStore !== null && this.siteId !== null) {\n                    this.projectId = p.id;\n                    this.projectApiService.selectedProjectId = p.id;\n                    this.subdivisionSub = this.calculationService.setData(this.dataStore, this.siteId, this.projectId).subscribe(res => {\n                        this.projectName = p.name;\n                        this.done = true;\n                        this.createdProject = true;\n                        this.creatingProject = false;\n                    });\n                }\n            }, error => {\n                console.dir(error);\n                this.creatingProject = false;\n            });\n        }\n    }\n\n}\n","<form *ngIf=\"siteId && !createdProject else complete\" [formGroup]=\"addProjectForm\" class=\"cas-form-floating push-up-2\">\n    <acabim-form-block labelWidth=\"9\" [labelAlign]=\"'right'\" [colonize]=\"true\">\n        <acabim-form-input-wrapper>\n            <acabim-form-input-label [required]=\"true\">Project Name</acabim-form-input-label>\n            <acabim-form-input-content [mediumField]=\"true\">\n                <input type=\"text\" pInputText formControlName=\"projectName\">\n            </acabim-form-input-content>\n        </acabim-form-input-wrapper>\n        <acabim-form-input-wrapper>\n            <acabim-form-input-label>Description</acabim-form-input-label>\n            <acabim-form-input-content [longerField]=\"true\">\n                <textarea pInputTextarea [rows]=\"3\" formControlName=\"projectDescription\"></textarea>\n            </acabim-form-input-content>\n        </acabim-form-input-wrapper>\n    </acabim-form-block>\n    <div class=\"cas-action-buttons push-up-2 cas-action-buttons-centred\">\n        <button (click)=\"addProject()\" class=\"cas-button-action\">Add Project</button>\n    </div>\n</form>\n\n<ng-template #complete>\n    <ng-container *ngIf=\"siteId && projectName else error\">\n        <div class=\"cas-info\">\n            <h1>Done!</h1>\n            <p>A new project called {{projectName}} has been created and the data from your calculations have been saved to it.</p>\n            <button (click)=\"closeModal()\" class=\"cas-button-action push-up-2\">Close</button>\n        </div>\n    </ng-container>\n</ng-template>\n\n\n<ng-template #error>\n    <div class=\"cas-error\">\n        <h1>Error!</h1>\n        <p>Something went wrong!</p>\n    </div>\n</ng-template>\n","import {Component, Input} from '@angular/core';\nimport {\n    GenericPayloadClass,\n    GenericPayloadModel,\n    GenericPayloadType,\n    LandBuildingInfo\n} from '@cas-hub/acabim-common-client';\nimport {Observable} from 'rxjs';\nimport {Store} from '@ngrx/store';\n\n@Component({\n    selector: 'acaland-building-data-viewer',\n    templateUrl: './building-data-viewer.component.html',\n    styleUrls: ['./building-data-viewer.component.scss']\n})\nexport class BuildingDataViewerComponent {\n    buildingDataNgrx: LandBuildingInfo | null = null;\n    calculationData$: Observable<any> = new Observable<any>();\n    isLoading = false;\n    payload: GenericPayloadModel[] = [];\n    columnHeaders: string[] = [\n        'Attribute',\n        'Value'\n    ];\n\n    private genericPayloadClass: GenericPayloadClass = new GenericPayloadClass();\n\n    @Input()\n    public set loading(value: boolean) {\n        this.isLoading = value;\n    }\n\n    constructor(\n        private store: Store<any>\n    ) {\n        this.calculationData$ = this.store.select('subdivision');\n        this.calculationData$.subscribe(d => {\n            if (d.linz && d.linz.building) {\n                this.buildingDataNgrx = d.linz.building;\n            } else {\n                this.buildingDataNgrx = null;\n            }\n            this.setData();\n        });\n    }\n\n    setData(): void {\n        if (this.buildingDataNgrx) {\n            this.genericPayloadClass = new GenericPayloadClass();\n            this.genericPayloadClass.objectIn = this.buildingDataNgrx;\n            this.genericPayloadClass.handleProperty('buildingId');\n            this.genericPayloadClass.handleProperty('name', 'Building Name');\n            this.genericPayloadClass.handleProperty('use', 'Building Use');\n            this.genericPayloadClass.handleProperty('suburb');\n            this.genericPayloadClass.handleProperty('town');\n            this.genericPayloadClass.handleProperty('territorialAuthority');\n            this.genericPayloadClass.handleProperty('captureMethod');\n            this.genericPayloadClass.handleProperty('captureSourceGroup');\n            this.genericPayloadClass.handleProperty('captureSourceId');\n            this.genericPayloadClass.handleProperty('captureSourceName');\n            this.genericPayloadClass.handleProperty('captureSourceFrom', undefined, GenericPayloadType.date);\n            this.genericPayloadClass.handleProperty('captureSourceTo', undefined, GenericPayloadType.date);\n            this.genericPayloadClass.handleProperty('addressId');\n            this.genericPayloadClass.handleProperty('changeId');\n            this.genericPayloadClass.handleProperty('addressType');\n            this.genericPayloadClass.handleProperty('unitValue');\n            this.genericPayloadClass.handleProperty('addressNumber');\n            this.genericPayloadClass.handleProperty('addressNumberSuffix');\n            this.genericPayloadClass.handleProperty('addressNumberHigh');\n            this.genericPayloadClass.handleProperty('waterRouteName');\n            this.genericPayloadClass.handleProperty('suburbLocality');\n            this.genericPayloadClass.handleProperty('townCity');\n            this.genericPayloadClass.handleProperty('fullAddressNumber');\n            this.genericPayloadClass.handleProperty('fullRoadName');\n            this.genericPayloadClass.handleProperty('fullAddress');\n            this.genericPayloadClass.handleProperty('roadSectionId');\n            this.genericPayloadClass.handleProperty('lastModified', undefined, GenericPayloadType.date);\n            this.payload = this.genericPayloadClass.getPayload();\n        } else {\n            this.payload = [];\n        }\n    }\n\n} // EOC\n","<ng-container *ngIf=\"!isLoading; else loadingView\">\n    <div class=\"col-md-12 cas-pad\" *ngIf=\"payload.length > 0\">\n        <acabim-data-display\n            [dataMap]=\"payload\"\n            [columnHeaders]=\"columnHeaders\"\n            labelWidth=\"12rem\"\n            labelAlignment=\"right\"\n            valueAlignment=\"left\"\n            [atFoot]=\"true\"\n            [copy]=\"true\"></acabim-data-display>\n    </div>\n    <div class=\"col-md-12\" *ngIf=\"payload.length < 1\">\n        <div class=\"cas-error\">No building data available.</div>\n    </div>\n</ng-container>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n  selector: 'acaland-compliance-checklists',\n  templateUrl: './compliance-checklists.component.html',\n  styleUrls: ['./compliance-checklists.component.scss']\n})\nexport class ComplianceChecklistsComponent implements OnInit {\n\n  constructor() { }\n\n    qaObjects: { name: string, capId: string }[] = [\n        {name: 'Land Development Process', capId: 'QA_LandDevelopmentProcess'}\n    ];\n    selectedObject?: { name: string, capId: string };\n\n    ngOnInit(): void {\n    }\n\n    loadQA() {\n\n    }\n\n}\n","<h1 class=\"title\">Q&A Compliance Checks</h1>\n<h5>&nbsp;</h5>\n\n<form>\n    <acabim-card cardHeading=\"Select a Compliance Checklist\"\n                 [cardContent]=\"qaContent\"\n                 [hasHelpButton]=true\n                 [helpMessage]=\"'These checklists are generated from CAP and are based on industry-standard procedures. Additional checklists can be created relatively easily. Please contact us for further details.'\"\n    ></acabim-card>\n</form>\n<ng-template #qaContent>\n    <div class=\"mb-2 mt-2\">\n        <p-dropdown\n            appendTo=\"body\"\n            [(ngModel)]=\"selectedObject\"\n            [options]=\"qaObjects\"\n            optionLabel=\"name\"\n            placeholder=\"Please choose one\"\n            (onChange)=\"loadQA()\"\n        ></p-dropdown>\n    </div>\n</ng-template>\n<acabim-qa-acabim-qa-lib [capId]=\"selectedObject.capId\" *ngIf=\"selectedObject\"></acabim-qa-acabim-qa-lib>\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import {Component, Input, OnInit, SimpleChanges, ViewChild} from '@angular/core';\nimport {AcabimSite, MapViewerComponent, SiteApiService} from '@cas-hub/acabim-common-client';\nimport {tap} from 'rxjs/operators';\n\n@Component({\n    selector: 'acaland-assets-site-detail',\n    templateUrl: './site-detail.component.html',\n    styleUrls: ['./site-detail.component.scss']\n})\nexport class SiteDetailComponent implements OnInit {\n    @Input() siteId!: string;\n    @Input() mapOnly = false;\n\n    currentSite?: AcabimSite;\n    area?: number;\n    perimeter?: number;\n    latiDegree?: number;\n    latiMin?: number;\n    latiSec?: number;\n\n    longiDegree?: number;\n    longiMin?: number;\n    longiSec?: number;\n    private _mapView?: MapViewerComponent;\n    public mapCoordinates?: number[][];\n\n    // TO DO: get legalDescription to display as well\n    // legalDescription?: string;\n    // propertyData?: LandPropertyParcelInfo;\n\n    @ViewChild('mapViewer', {static: false})\n    public set mapView(content: MapViewerComponent | undefined) {\n        this._mapView = content;\n    }\n\n    public get mapView(): MapViewerComponent | undefined {\n        return this._mapView;\n    }\n\n    constructor(private readonly siteApiService: SiteApiService) {\n    }\n\n    private refreshMap(): void {\n        if (!this.currentSite) {\n            return;\n        }\n\n        this.mapCoordinates = this.currentSite?.coordinates;\n        if (this.mapView) {\n            this.mapView.path = this.mapCoordinates;\n            if (this.currentSite?.address) {\n                this.mapView.locationTitle = this.currentSite.address;\n                this.mapView.mapConfig = {\n                    zoom: 16,\n                    centerLongitude: this.currentSite.longitude,\n                    centerLatitude: this.currentSite.latitude\n                };\n            }\n            this.mapView.refreshMapView().then(r => {\n            });\n        }\n\n    }\n\n    // tslint:disable-next-line:use-lifecycle-interface\n    ngOnChanges(changes: SimpleChanges): void {\n        if (changes.siteId) {\n            this.siteApiService.getSite(this.siteId, {\n                includeCoordinates: true,\n                includeProjects: false,\n                includeGroups: false\n            }).pipe(tap(site => {})).subscribe(site => {\n                this.currentSite = site;\n                this.area = Math.ceil(Number(site.area));\n                this.perimeter = Math.ceil(Number(site.perimeter));\n\n                if (site.latitude > 0) {\n                    this.latiDegree = Math.floor(site.latitude);\n                } else {\n                    this.latiDegree = Math.ceil(site.latitude);\n                }\n                if (((site.latitude - this.latiDegree) * 60) > 0) {\n                    this.latiMin = Math.abs(Math.floor(((site.latitude - this.latiDegree) * 60)));\n                } else {\n                    this.latiMin = Math.abs(Math.ceil(((site.latitude - this.latiDegree) * 60)));\n                }\n                this.latiSec = Number(((Math.abs(site.latitude) - Math.abs(this.latiDegree) - this.latiMin / 60) * 3600).toFixed(2));\n\n                if (site.longitude > 0) {\n                    this.longiDegree = Math.floor(site.longitude);\n                } else {\n                    this.longiDegree = Math.ceil(site.longitude);\n                }\n                if (((site.longitude - this.longiDegree) * 60) > 0) {\n                    this.longiMin = Math.abs(Math.floor(((site.longitude - this.longiDegree) * 60)));\n                } else {\n                    this.longiMin = Math.abs(Math.ceil(((site.longitude - this.longiDegree) * 60)));\n                }\n                this.longiSec = Number(((Math.abs(site.longitude) - Math.abs(this.longiDegree) - this.longiMin / 60) * 3600).toFixed(2));\n\n                this.refreshMap();\n\n            });\n        }\n    }\n\n    ngOnInit(): void {\n    }\n\n\n}\n","<div *ngIf=\"!mapOnly\">\n    <div class=\"cas-flex-row\" *ngIf=\"currentSite else loadingView\">\n        <div class=\"p-col-5\">\n            <div class=\"cas-flex-row\">\n                <div class=\"p-col-4\">\n                    <h6>Address</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{currentSite ? currentSite.address : ''}}</h6>\n                </div>\n                <div class=\"p-col-4\">\n                    <h6>Latitude</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{latiDegree + '°' + latiMin + '\\'' + latiSec + '\\'\\''}}</h6>\n                </div>\n                <div class=\"p-col-4\">\n                    <h6>Longitude</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{longiDegree + '°' + longiMin + '\\'' + longiSec + '\\'\\''}}</h6>\n                </div>\n                <div class=\"p-col-4\">\n                    <h6>Area (m<sup>2</sup>)</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{area | number}}</h6>\n                </div>\n                <div class=\"p-col-4\">\n                    <h6>Boundary length (m)</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{perimeter | number}}</h6>\n                </div>\n                <div class=\"p-col-4\">\n                    <h6>Last Modified</h6>\n                </div>\n                <div class=\"p-col-8\">\n                    <h6>{{currentSite.lastModifiedDate | date: 'dd/MM/yyyy'}}</h6>\n                </div>\n            </div>\n        </div>\n        <div class=\"p-col-7\">\n            <div class=\"cas-flex-row\">\n                <div class=\"p-col-12\" style=\"height: 25rem\">\n                    <acabim-map-viewer #mapViewer\n                                       [path]=\"mapCoordinates\"\n                    ></acabim-map-viewer>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<div class=\"cas-flex-row\" *ngIf=\"mapOnly\">\n    <div class=\"p-col-12\" style=\"height: 15rem\">\n        <acabim-map-viewer #mapViewer\n                           [path]=\"mapCoordinates\"\n        ></acabim-map-viewer>\n    </div>\n</div>\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n","import {Component, OnInit, Optional, ViewChild} from '@angular/core';\nimport {ColumnFilter, DataTableColumnData, DataTableConfig, DatatableComponent, DataTableDataSource,\n    DataTableLazyLoadDataSource, DataTableLazyLoadRefresher, DataTableObservableCompletionListener,\n    DataTableObservableErrorListener, isPaginated, PaginatedRequest, SiteApiService, Status,\n    TableAction} from '@cas-hub/acabim-common-client';\nimport {NGXLogger} from 'ngx-logger';\nimport {map} from 'rxjs/operators';\n\ninterface LandTableSiteDetailsItem {\n    readonly id: string;\n    readonly name: string;\n    readonly area: string;\n    readonly perimeter: string;\n}\n\n@Component({\n    selector: 'acaland-land-table-dashboard',\n    templateUrl: './land-table-dashboard.component.html',\n    styleUrls: ['./land-table-dashboard.component.scss']\n})\nexport class LandTableDashboardComponent implements OnInit {\n    public loading = false;\n    public quantityFormat = {minimumFractionDigits: 2, maximumFractionDigits: 2};\n    @ViewChild('siteDatatable') public dataTable?: DatatableComponent;\n    public siteDataSources: DataTableDataSource<LandTableSiteDetailsItem>[] = [];\n\n    constructor(private readonly siteApiService: SiteApiService,\n                @Optional() private readonly logger?: NGXLogger) {\n    }\n\n    public toggleSiteDetailStatus($event: boolean): void {\n        this.siteDataSources[0].showDetails = $event;\n    }\n\n    public ngOnInit(): void {\n        this.siteDataSources.push(new SiteDataSource((first, length, sortOrder, sortField, filters) => {\n                const paginatedRequest = PaginatedRequest.FromDatatableRefresher(first, length, sortOrder, sortField);\n                return this.siteApiService.getAllSites(paginatedRequest, {filterStatus: Status.active}, false)\n                    .pipe(map(data => {\n                        const parsedData: LandTableSiteDetailsItem[] = (isPaginated(data) ? data.data : data).map(site => ({\n                            id: site.id,\n                            name: site.name,\n                            area: Number(site.area).toLocaleString('en-NZ', this.quantityFormat),\n                            perimeter: Number(site.perimeter).toLocaleString('en-NZ', this.quantityFormat)\n                        }));\n\n                        return {\n                            totalRecords: isPaginated(data) ? data.totalRecords : data.length,\n                            data: parsedData\n                        };\n                    }));\n            },\n            (tableName: string, error: Error) => {\n                this.logger?.error(`[LandTableDashboardComponent] Error in loading data for table ${tableName}`, error);\n            },\n            (tableName: string) => {\n                this.logger?.debug(`[LandTableDashboardComponent] Completed loading data for table ${tableName}`);\n            }, (action: TableAction) => {\n            }\n        ));\n    }\n}\n\nexport class SiteDataSource extends DataTableLazyLoadDataSource<LandTableSiteDetailsItem> {\n    public readonly columnData: DataTableColumnData[] =\n        [\n            {displayName: 'Name', objectPropertyName: 'name'},\n            {displayName: 'Area (㎡)', objectPropertyName: 'area', textAlign: 'right', colWidth: '120px'},\n            {displayName: 'Boundary length (𝗺)', objectPropertyName: 'perimeter', textAlign: 'right', colWidth: '180px'}\n        ];\n\n    public readonly config: DataTableConfig = {\n        tableHeading: '',\n        isSearchEnabled: false,\n        searchPlaceHolder: 'Search Site',\n        emptyMessage: '',\n        globalFilterFields: [],\n        hasCheckbox: false,\n        hasDetailsButton: true,\n        isLazyLoadingEnabled: false,\n        isPaginationEnabled: false,\n        hasFilters: false,\n        isExportEnabled: false,\n        hasActions: false\n    };\n\n    public readonly columnFilters: ColumnFilter[] = [];\n    public readonly actions: TableAction[] = [];\n\n    public onDataExpanded(value: LandTableSiteDetailsItem): void {\n    }\n\n    constructor(readonly refresher: DataTableLazyLoadRefresher<LandTableSiteDetailsItem>,\n                readonly observableErrorListener?: DataTableObservableErrorListener,\n                readonly observableCompleteListener?: DataTableObservableCompletionListener,\n                readonly actionListener?: (action: TableAction) => void) {\n        super(refresher, observableErrorListener, observableCompleteListener);\n        this.config = {\n            tableHeading: '',\n            isSearchEnabled: false,\n            searchPlaceHolder: '',\n            emptyMessage: 'No sites found',\n            globalFilterFields: [],\n            hasCheckbox: false,\n            hasDetailsButton: true,\n            isLazyLoadingEnabled: true,\n            isPaginationEnabled: true,\n            hasFilters: false,\n            isExportEnabled: false,\n            hasActions: false\n        };\n    }\n\n    public onAction(action: TableAction): void {\n        if (this.actionListener) {\n            this.actionListener(action);\n        }\n    }\n}\n","<form>\n    <acabim-card cardHeading=\"Land\" [cardContent]=\"landTable\"\n                 [hasHelpButton]=\"true\"\n                 [helpMessage]=\"'The Dashboard shows all your land development projects. Click on each eye icon to view the location details.'\"\n                 [extLinkUrl] = \"'https://cas.net.nz/acaland'\"\n                 [linkText]=\"'ACALand Video Guide'\">\n    </acabim-card>\n</form>\n<ng-template #landTable>\n    <acabim-datatable #siteDatatable [dataSources]=\"siteDataSources\" hasDetailView=\"true\">\n    </acabim-datatable>\n</ng-template>\n<ng-template [ngIf]=\"siteDataSources[0].showDetails\">\n    <acabim-modal [display]=\"true\" [title]=\"'Site Details'\" (status)=\"toggleSiteDetailStatus($event)\">\n        <acaland-assets-site-detail [siteId]=\"siteDataSources[0].detailData?.id\"></acaland-assets-site-detail>\n    </acabim-modal>\n</ng-template>\n\n","import { Component, OnInit } from '@angular/core';\nimport {AcabimProject} from '@cas-hub/acabim-common-client';\n\n@Component({\n  selector: 'acaland-dashboard',\n  templateUrl: './dashboard.component.html',\n  styleUrls: ['./dashboard.component.scss']\n})\nexport class DashboardComponent implements OnInit {\n    projects: AcabimProject[] = [];\n\n  constructor() {\n  }\n\n\n    ngOnInit(): void {\n    }\n\n}\n","<h1 class=\"title\">Dashboard</h1>\n<h5>&nbsp;</h5>\n<!--\n<acabim-assets-asset-dashboard></acabim-assets-asset-dashboard>\n!-->\n<acaland-land-table-dashboard></acaland-land-table-dashboard>\n\n","import {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {Observable, Subject} from 'rxjs';\nimport {MessageService} from 'primeng/api';\nimport {\n    GenericPayloadClass,\n    GenericPayloadModel, GenericPayloadType,\n} from '@cas-hub/acabim-common-client';\nimport {Store} from '@ngrx/store';\nimport {ComplianceParameter} from '../../../_models/subdivision-calculation.model';\n\n@Component({\n    selector: 'acaland-design-params-viewer',\n    templateUrl: './design-params-viewer.component.html',\n    styleUrls: ['./design-params-viewer.component.scss'],\n    providers: [MessageService]\n\n})\nexport class DesignParamsViewerComponent implements OnInit, OnDestroy {\n    payload: GenericPayloadModel[] = [];\n    columnHeaders: string[] = [\n        'Parameter',\n        'Value'\n    ];\n    isLoading = false;\n\n    private genericPayloadClass: GenericPayloadClass = new GenericPayloadClass();\n\n    @Input()\n    public set loading(value: boolean) {\n        this.isLoading = value;\n    }\n\n    private unsubscribe$ = new Subject<void>();\n\n    calculationData$: Observable<any> = new Observable<any>();\n    calculationDataPayload: GenericPayloadModel[] = [];\n    cap: ComplianceParameter | null = null;\n\n    constructor(private store: Store<any>) {\n        this.calculationData$ = this.store.select('subdivision');\n    }\n\n    public ngOnInit(): void {\n        this.calculationData$.subscribe(d => {\n            if (d.cap) {\n                this.cap = d.cap;\n            } else {\n                this.cap = null;\n            }\n            this.setData();\n        });\n    }\n\n    public ngOnDestroy(): void {\n        this.unsubscribe$.next();\n        this.unsubscribe$.complete();\n    }\n\n    setData(): void {\n        if (this.cap) {\n            this.genericPayloadClass = new GenericPayloadClass();\n            this.genericPayloadClass.objectIn = this.cap;\n            this.genericPayloadClass.handleProperty('zone');\n            this.genericPayloadClass.handleProperty('landscapedAreaRatio', undefined, GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('impermeableAreaRatio', 'Impermeable Area Ratio, if applicable', GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('rearClearance', undefined, GenericPayloadType.metres);\n            this.genericPayloadClass.handleProperty('sideClearance', undefined, GenericPayloadType.metres);\n            this.genericPayloadClass.handleProperty('frontClearance', undefined, GenericPayloadType.metres);\n            this.genericPayloadClass.handleProperty('outdoorLivingArea', undefined, GenericPayloadType.sqm);\n            this.genericPayloadClass.handleProperty('buildingCoverageRatio', undefined, GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('buildingsPerSite', 'Buildings per site, if applicable', GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('maxParkingRate', 'Parking Rate, if applicable', GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('lrmlRuleId1', 'LRML Ruleset #1');\n            this.genericPayloadClass.handleProperty('lrmlRuleId2', 'LRML Ruleset #2');\n            this.payload = this.genericPayloadClass.getPayload();\n        } else {\n            this.payload = [];\n        }\n    }\n}\n","<ng-container *ngIf=\"!isLoading; else loadingView\">\n    <div class=\"col-md-12 cas-pad\" *ngIf=\"payload.length > 0\" >\n        <acabim-data-display\n            [dataMap]=\"payload\"\n            [columnHeaders]=\"columnHeaders\"\n            labelWidth=\"16rem\"\n            labelAlignment=\"right\"\n            valueAlignment=\"left\"\n            [atFoot]=\"true\"\n            [copy]=\"true\"></acabim-data-display>\n    </div>\n    <div class=\"col-md-12\" *ngIf=\"payload.length < 1\" >\n        <div class=\"cas-error\">Planning zone not selected or no available design parameters for the selected zone.</div>\n    </div>\n</ng-container>\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n<p-toast position=\"center\"></p-toast>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n    selector: 'acaland-documents',\n    templateUrl: './documents.component.html',\n    styleUrls: ['./documents.component.scss']\n})\nexport class DocumentsComponent implements OnInit {\n    documentTypes = [\n        {label: 'As-built Survey', value: 'AsBuiltSurvey'},\n        {label: 'Asbestos Report', value: 'AsbestosReport'},\n        {label: 'CCTV Footage', value: 'CctvFootage'},\n        {label: 'Chorus Certificate', value: 'ChorusCertificate'},\n        {label: 'COA', value: 'Coa'},\n        {label: 'Drainlayer CS4', value: 'DrainLayerCs4'},\n        {label: 'Driveway Inspection', value: 'DrivewayInspection'},\n        {label: 'EPA', value: 'Epa'},\n        {label: 'New Connection Photos', value: 'NewConnectionPhotos'},\n        {label: 'Proof of Address', value: 'ProofOfAAddress'},\n        {label: 'QA Inspection Record', value: 'QaInspectionRecord'},\n        {label: 'RC', value: 'Rc'},\n        {label: 'Schedule of Vesting', value: 'ScheduleOfVesting'},\n        {label: 'Scheme Plan', value: 'SchemePlan'},\n        {label: 'Storm/Wastewater', value: 'StormWastewater'},\n        {label: 'Vector Certificate', value: 'VectorCertificate'},\n        {label: 'VX AT Certificate', value: 'VxAtCertificate'},\n    ];\n\n    constructor() { }\n\n    ngOnInit(): void {\n    }\n\n}\n","<h1 class=\"title\">Documents</h1>\n<h5>Manage land development documents</h5>\n<acawork-manage-document [domain]=\"'acaland'\" [fileMetadataTypes]=\"documentTypes\"></acawork-manage-document>\n","export class AucklandUnitaryPlanZones {\n    static aupZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'H1', value: 'Residential - Large Lot'},\n        {key: 'H2', value: 'Residential - Rural and Coastal Settlement'},\n        {key: 'H3', value: 'Residential - Single House'},\n        {key: 'H4', value: 'Residential - Mixed Housing Suburban'},\n        {key: 'H5', value: 'Residential - Mixed Housing Urban'},\n        {key: 'H6', value: 'Residential - Terrace Housing and Apartment Buildings'},\n        {key: 'H7', value: 'Open Space'},\n        {key: 'H8', value: 'Business - City Centre'},\n        {key: 'H9', value: 'Business - Metropolitan Centre'},\n        {key: 'H10', value: 'Business - Town Centre'},\n        {key: 'H11', value: 'Business - Local Centre'},\n        {key: 'H12', value: 'Business - Neighbourhood Centre'},\n        {key: 'H13', value: 'Business - Mixed Use'},\n        {key: 'H14', value: 'Business - General Business'},\n        {key: 'H15', value: 'Business - Business Park'},\n        {key: 'H16', value: 'Business - Heavy Industry'},\n        {key: 'H17', value: 'Business - Light Industry'},\n        {key: 'H18', value: 'Future Urban'},\n        {key: 'H19', value: 'Rural'},\n        {key: 'H20', value: 'Rural - Waitākere Foothills'},\n        {key: 'H21', value: 'Rural - Waitākere Ranges'},\n        {key: 'H22', value: 'Strategic Transport Corridor'},\n        {key: 'H23', value: 'Special Purpose - Airports and Airfields'},\n        {key: 'H24', value: 'Special Purpose - Cemetery'},\n        {key: 'H25', value: 'Special Purpose - Healthcare Facility and Hospital'},\n        {key: 'H26', value: 'Special Purpose - Major Recreation Facility'},\n        {key: 'H27', value: 'Special Purpose - Māori Purpose'},\n        {key: 'H28', value: 'Special Purpose - Quarry'},\n        {key: 'H29', value: 'Special Purpose - School'},\n        {key: 'H30', value: 'Special Purpose - Tertiary Education'}\n    ];\n}\n","export class BayOfPlentyPlanZones {\n    static bayOfPlentyPlanZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'S13', value: 'Residential'},\n        {key: 'S14', value: 'Medium Density Residential'},\n        {key: 'S15', value: 'Future Urban'},\n        {key: 'S17', value: 'Lifestyle'},\n        {key: 'S19', value: 'Commercial'},\n        {key: 'S21', value: 'Industrial'},\n    ];\n}\n","export class CanterburyPlanZones {\n    static canterburyZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'H1', value: 'Residential - Large Lot'},\n        {key: 'H2', value: 'Residential - Rural and Coastal Settlement'},\n        {key: 'H3', value: 'Residential - Single House'},\n        {key: 'H4', value: 'Residential - Mixed Housing Suburban'},\n        {key: 'H5', value: 'Residential - Mixed Housing Urban'},\n        {key: 'H6', value: 'Residential - Terrace Housing and Apartment Buildings'},\n        {key: 'H7', value: 'Open Space'},\n        {key: 'H8', value: 'Business - City Centre'},\n        {key: 'H9', value: 'Business - Metropolitan Centre'},\n        {key: 'H10', value: 'Business - Town Centre'},\n        {key: 'H11', value: 'Business - Local Centre'},\n        {key: 'H12', value: 'Business - Neighbourhood Centre'},\n        {key: 'H13', value: 'Business - Mixed Use'},\n        {key: 'H14', value: 'Business - General Business'},\n        {key: 'H15', value: 'Business - Business Park'},\n        {key: 'H16', value: 'Business - Heavy Industry'},\n        {key: 'H17', value: 'Business - Light Industry'},\n        {key: 'H18', value: 'Future Urban'},\n        {key: 'H19', value: 'Rural'},\n        {key: 'H20', value: 'Rural - Waitākere Foothills'},\n        {key: 'H21', value: 'Rural - Waitākere Ranges'},\n        {key: 'H22', value: 'Strategic Transport Corridor'},\n        {key: 'H23', value: 'Special Purpose - Airports and Airfields'},\n        {key: 'H24', value: 'Special Purpose - Cemetery'},\n        {key: 'H25', value: 'Special Purpose - Healthcare Facility and Hospital'},\n        {key: 'H26', value: 'Special Purpose - Major Recreation Facility'},\n        {key: 'H27', value: 'Special Purpose - Māori Purpose'},\n        {key: 'H28', value: 'Special Purpose - Quarry'},\n        {key: 'H29', value: 'Special Purpose - School'},\n        {key: 'H30', value: 'Special Purpose - Tertiary Education'}\n    ];\n}\n","export class FranklinPlanZones {\n    static franklinPlanZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: '26.1', value: 'Residential'},\n        {key: '26.2', value: 'Residential 2'},\n        {key: '29', value: 'Business'}\n    ];\n}\n","export class GisbornePlanZones {\n    static gisborneZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'T14B', value: 'Residential'},\n        {key: 'T17A', value: 'Commercial'},\n    ];\n}\n","export class HawkesBayPlanZones {\n    static hawkesBayZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'T14B', value: 'Residential'},\n        {key: 'T17A', value: 'Commercial'},\n    ];\n}\n","export class ManawatuWanganuiPlanZones {\n    static manawatuWanganuiZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'RE', value: 'Residential'},\n        {key: 'CM', value: 'Commercial'},\n    ];\n}\n","export class MarlboroughPlanZones {\n    static marlboroughZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'RE', value: 'Residential'},\n        {key: 'CM', value: 'Commercial'},\n    ];\n}\n","export class NorthlandPlanZones {\n    static northlandZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'RE', value: 'Residential'},\n        {key: 'CM', value: 'Commercial'},\n        {key: 'IN', value: 'Industrial'},\n    ];\n}\n","export class OtagoPlanZones {\n    static otagoZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'RE', value: 'Residential'},\n        {key: 'CM', value: 'Commercial'},\n    ];\n}\n","export class RuapehuPlanZones {\n    static ruapehuZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'RE', value: 'Residential'},\n        {key: 'CM', value: 'Commercial'},\n        {key: 'IN', value: 'Industrial'},\n    ];\n}\n","export class SouthWaikatoPlanZones {\n    static southWaikatoZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'SW17', value: 'Tokoroa Town Center Zone'},\n        {key: 'SW18', value: 'Tokoroa Business Zone'},\n        {key: 'SW19', value: 'Tokoroa Neighbourhood Retail Zone'},\n        {key: 'SW20', value: 'Tokoroa Residential Zone'},\n        {key: 'SW21', value: 'Putaruru Town Centre Zone'},\n        {key: 'SW22', value: 'Putaruru Business Zone'},\n        {key: 'SW23', value: 'Putaruru Residential Zone'},\n        {key: 'SW24', value: 'Tirau Town Centre Zone'},\n        {key: 'SW25', value: 'Tirau Residential Zone'},\n        {key: 'SW26', value: 'Arapuni Village Zone'},\n        {key: 'SW27', value: 'Industrial Zone'},\n        {key: 'SW28', value: 'Rural Zone'},\n        {key: 'SW29', value: 'Rural Residential Zone'},\n        {key: 'SW30', value: 'Electricity Generation Zone'},\n        {key: 'SW31', value: 'Tokoroa Airport Zone'}\n    ];\n}\n","export class TaranakiPlanZones {\n    static taranakiZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'LRZ', value: 'Low Density Residential'},\n        {key: 'GRZ', value: 'General Residential'},\n        {key: 'MRZ', value: 'Medium Density Residential'},\n        {key: 'RP', value: 'Papakainga'},\n    ];\n}\n","export class TaurangaPlanZones {\n    static taurangaZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'T14B', value: 'Suburban and Large Lot Residential'},\n        {key: 'T14C', value: 'Marae Community'},\n        {key: 'T14D', value: 'City Living'},\n        {key: 'T14E', value: 'High/Medium Density Residential'},\n        {key: 'T14F', value: 'Wairakei Residential'},\n        {key: 'T15', value: 'Rural Residential'},\n        {key: 'T17A', value: 'Commercial'},\n        {key: 'T18', value: 'Industrial'},\n    ];\n}\n","export class WaikatoPlanZones {\n    static waikatoPlanZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: '21.1', value: 'Living'},\n        {key: '21.2', value: 'Living - Te Kauwhata Ecological'},\n        {key: '21.3', value: 'Living - Te Kauwhata West'},\n        {key: '21.4', value: 'New Residential'},\n        {key: '22', value: 'Pa'},\n        {key: '23', value: 'Business'},\n        {key: '24.1', value: 'Heavy Industrial'},\n        {key: '24.2', value: 'Industrial Park'},\n        {key: '24.3', value: 'Light Industrial'},\n        {key: '25', value: 'Rural'},\n        {key: '26', value: 'Coastal'},\n        {key: '27', value: 'Country Living'},\n        {key: '28', value: 'Recreation'},\n        {key: '29', value: 'Business (Franklin)'},\n    ];\n}\n","export class WellingtonPlanZones {\n    static wellingtonZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'H1', value: 'Residential - Large Lot'},\n        {key: 'H2', value: 'Residential - Rural and Coastal Settlement'},\n        {key: 'H3', value: 'Residential - Single House'},\n        {key: 'H4', value: 'Residential - Mixed Housing Suburban'},\n        {key: 'H5', value: 'Residential - Mixed Housing Urban'},\n        {key: 'H6', value: 'Residential - Terrace Housing and Apartment Buildings'},\n        {key: 'H7', value: 'Open Space'},\n        {key: 'H8', value: 'Business - City Centre'},\n        {key: 'H9', value: 'Business - Metropolitan Centre'},\n        {key: 'H10', value: 'Business - Town Centre'},\n        {key: 'H11', value: 'Business - Local Centre'},\n        {key: 'H12', value: 'Business - Neighbourhood Centre'},\n        {key: 'H13', value: 'Business - Mixed Use'},\n        {key: 'H14', value: 'Business - General Business'},\n        {key: 'H15', value: 'Business - Business Park'},\n        {key: 'H16', value: 'Business - Heavy Industry'},\n        {key: 'H17', value: 'Business - Light Industry'},\n        {key: 'H18', value: 'Future Urban'},\n        {key: 'H19', value: 'Rural'}\n    ];\n}\n","export class WestCoastPlanZones {\n    static westCoastZonesObj = [{key: '', value: 'Select a Zone'},\n        {key: 'T14B', value: 'Residential'},\n        {key: 'T17A', value: 'Commercial'},\n    ];\n}\n","import {Injectable} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {ApiService, EnvironmentModel} from '@cas-hub/acabim-common-client';\nimport {Observable} from 'rxjs';\nimport {AllRegionsResponse, RegionFromPostcode} from '../_models/postcode.model';\nimport {map} from 'rxjs/operators';\n\n@Injectable({providedIn: 'root'})\nexport abstract class PostcodeService extends ApiService {\n    constructor(protected client: HttpClient,\n                protected environment: EnvironmentModel) {\n        super(client, environment);\n    }\n    protected url(countryCode: string): string {\n        return this.environment.apiSource + '/region/' + countryCode;\n    }\n    protected envUrl(url: string): string {\n        return this.environment.apiSource + '/' + url;\n    }\n\n    public getRegion(postcode: string | null): Observable<RegionFromPostcode> {\n        if (postcode === null) {\n            return new Observable<any>();\n        }\n        let params = new HttpParams();\n        params = params.set('postcode', String(postcode));\n        return this.client.post<RegionFromPostcode>(this.url('nzl'), params, {\n            headers: this.defaultHeaders,\n            responseType: 'json'\n        });\n    }\n\n    public getAllRegions(): Observable<AllRegionsResponse> {\n        return this.client.get(this.url('nzl'), {\n            headers: this.defaultHeaders,\n            responseType: 'json'\n        }).pipe(map(data => data as AllRegionsResponse));\n    }\n}\n","import {Injectable} from '@angular/core';\nimport {DeCamelPipe, GenericPayloadModel, GenericPayloadType} from '@cas-hub/acabim-common-client';\n\n@Injectable({providedIn: 'root'})\nexport abstract class SubdivisionUtilitiesClass {\n\n    protected constructor(private readonly deCamelPipe: DeCamelPipe) {}\n\n    handleDataDisplay(data?: any): GenericPayloadModel[] {\n        if (data) {\n            const calculationDataPayload = [];\n            const ordered = Object.keys(data).sort().reduce(\n                (obj, key) => {\n                    // @ts-ignore\n                    obj[key] = data[key];\n                    return obj;\n                },\n                {}\n            );\n            for (const [key, value] of Object.entries(ordered)) {\n                if (key) {\n                    // @ts-ignore\n                    if (value && typeof value === 'object') {\n                        const objValues: string[] = [];\n                        // @ts-ignore\n                        for (const [key1, value1] of Object.entries(value)) {\n                            if (typeof value1 === 'object') {\n                                const objValues2: string[] = [];\n                                // @ts-ignore\n                                for (const [key3, value2] of Object.entries(value1)) {\n                                    objValues2.push(value2 as string);\n                                }\n                                objValues.push(key1 + ': ' + objValues2.join(', '));\n                            } else {\n                                objValues.push(value1 as string);\n                            }\n                        }\n                        calculationDataPayload.push({\n                            key,\n                            value: objValues.join(', '),\n                            // @ts-ignore\n                            label: this.deCamelPipe.transform(key.toString(), 'firstUp'),\n                            type: GenericPayloadType.text\n                        });\n                    } else {\n                        calculationDataPayload.push({\n                            key,\n                            value,\n                            // @ts-ignore\n                            label: this.deCamelPipe.transform(key.toString(), 'firstUp'),\n                            type: GenericPayloadType.text\n                        });\n                    }\n                }\n            }\n            return calculationDataPayload;\n        }\n        return [];\n    }\n\n} // EOC\n","// site-cache-manager.service.ts\nimport { Injectable } from '@angular/core';\nimport { AcabimSite } from '@cas-hub/acabim-common-client';\n\n@Injectable({ providedIn: 'root' })\nexport class SiteCacheManager {\n    private cache: Map<string, AcabimSite> = new Map();\n\n    constructor() {}\n\n    getSite(siteId: string): AcabimSite | null {\n        return this.cache.get(siteId) || null;\n    }\n\n    setSite(siteId: string, site: AcabimSite): void {\n        this.cache.set(siteId, site);\n    }\n\n    clearCache(): void {\n        this.cache.clear();\n    }\n}","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class MapStateService {\n  center: [number, number] = [174.7633, -36.8485]; // Default to Auckland\n  zoom = 16;\n\n  // Original legacy polygons array\n  polygons: {\n    coordinates: [number, number][];\n    isNew: boolean;\n  }[] = [];\n\n  // Primary + secondary polygon system\n  private primaryPolygon: BehaviorSubject<number[][]> = new BehaviorSubject<number[][]>([]);\n  private secondaryPolygons: BehaviorSubject<number[][][]> = new BehaviorSubject<number[][][]>([]);\n  private polygonHeights = new Map<number, number>();\n\n  // 🆕 BehaviorSubject to directly drive 3D polygons\n  private _polygonsFor3D = new BehaviorSubject<Array<{\n    coordinates: [number, number][];\n    height: number;\n    color: number | string;\n  }>>([]);\n\n  polygonsFor3D$ = this._polygonsFor3D.asObservable(); // observable for 3D component to subscribe\n\n  // 🆕 OL resolution for scaling 3D\n  private resolution: number = 1;\n\n  // === Methods ===\n\n  // LEGACY support\n  updatePolygons(polygonList: any[]) {\n    this.polygons = polygonList.map(p => ({\n      coordinates: p.coordinates,\n      isNew: p.isNew ?? false\n    }));\n  }\n\n  getPolygonsFor3D(): Array<{\n    coordinates: number[][];\n    isPrimary: boolean;\n    color: string;\n    height: number;\n  }> {\n    const result: Array<{\n      coordinates: number[][];\n      isPrimary: boolean;\n      color: string;\n      height: number;\n    }> = [];\n\n    if (this.primaryPolygon.getValue().length > 0) {\n      result.push({\n        coordinates: this.primaryPolygon.getValue(),\n        isPrimary: true,\n        color: '#5773a4',\n        height: 10\n      });\n    }\n\n    this.secondaryPolygons.getValue().forEach(polygon => {\n      if (polygon.length > 0) {\n        result.push({\n          coordinates: polygon,\n          isPrimary: false,\n          color: '#ff8005',\n          height: 5\n        });\n      }\n    });\n\n    if (result.length === 0) {\n      return this.polygons.map(poly => ({\n        coordinates: poly.coordinates,\n        isPrimary: false,\n        color: '#666666',\n        height: 3\n      }));\n    }\n\n    return result;\n  }\n\n  // === New cleaner for 3D direct polygons ===\n\n    private _immediatePolygons = new BehaviorSubject<Array<{\n        coordinates: [number, number][];\n        height: number;\n        color: number | string;\n    }> | null>(null);\n\n    // Clear all legacy polygon systems when setting new 3D polygons\n    setPolygonsFor3D(polygons: Array<{\n        coordinates: [number, number][];\n        height: number;\n        color: number | string;\n    }>) {\n        // Clear legacy systems to avoid conflicts\n        this.primaryPolygon.next([]);\n        this.secondaryPolygons.next([]);\n        this.polygons = [];\n\n        // Set new 3D polygons\n        this._polygonsFor3D.next(polygons);\n        console.log('PolygonsFor3D updated:', polygons);\n    }\n\n    getImmediatePolygons() {\n        return this._immediatePolygons.getValue();\n    }\n\n  getPolygonsFor3DStream() {\n    return this.polygonsFor3D$;\n  }\n\n    updatePolygonHeight(index: number, height: number): void {\n        this.polygonHeights.set(index, height);\n        const currentPolygons = this._polygonsFor3D.getValue();\n        if (currentPolygons && currentPolygons[index]) {\n            currentPolygons[index].height = height;\n            this._polygonsFor3D.next([...currentPolygons]); // Trigger update\n        }\n    }\n\n\n    getCurrentPolygonsFor3D() {\n        const polygons = this._polygonsFor3D.getValue();\n        if (!polygons) return [];\n\n        return polygons.map((polygon, index) => ({\n            ...polygon,\n            height: this.polygonHeights.get(index) || polygon.height\n        }));\n    }\n\n  // === Primary / secondary system ===\n\n  setPrimaryPolygon(coords: number[][]) {\n    console.log('Setting primary polygon:', coords);\n    this.primaryPolygon.next(coords);\n  }\n\n  setSecondaryPolygons(polygons: number[][][]) {\n    console.log('Setting secondary polygons:', polygons);\n    this.secondaryPolygons.next(polygons);\n  }\n\n  getPrimaryPolygon() {\n    return this.primaryPolygon.getValue();\n  }\n\n  getSecondaryPolygons() {\n    return this.secondaryPolygons.getValue();\n  }\n\n  // === Center & zoom ===\n\n  setCenter(center: [number, number]) {\n    this.center = center;\n  }\n\n  setZoom(zoom: number) {\n    this.zoom = zoom;\n  }\n\n  // === Resolution ===\n    setResolution(res: number) {\n        this.resolution = res;\n        console.log('MapStateService: resolution updated to', res);\n    }\n\n    getResolution(): number {\n        console.log('Returning resolution:', this.resolution);\n        return this.resolution;\n    }\n\n}\n","import {\n    AfterViewInit, Component, EventEmitter, Input, OnInit, Output,\n    HostListener, ViewChild, ElementRef\n} from '@angular/core';\nimport * as Control from 'ol/control';\nimport * as htmlToImage from 'html-to-image';\nimport Draw from 'ol/interaction/Draw';\nimport Modify from 'ol/interaction/Modify';\nimport GeoJSON from 'ol/format/GeoJSON';\nimport OSM from 'ol/source/OSM';\nimport Overlay from 'ol/Overlay';\nimport Snap from 'ol/interaction/Snap';\nimport TileLayer from 'ol/layer/Tile';\nimport VectorLayer from 'ol/layer/Vector';\nimport XYZ from 'ol/source/XYZ';\nimport Select from 'ol/interaction/Select';\nimport { Feature, View } from 'ol';\nimport Map from 'ol/Map';\nimport { Coordinate } from 'ol/coordinate';\nimport { Fill, Stroke, Style } from 'ol/style';\nimport { fromLonLat, toLonLat } from 'ol/proj';\nimport { Vector } from 'ol/source';\nimport { LineString } from 'ol/geom';\nimport { getLength, getArea } from 'ol/sphere';\nimport { Polygon } from 'ol/geom';\n\nimport { AcabimSite, SiteApiService } from '@cas-hub/acabim-common-client';\nimport { MapConfig, MapDefaultDimensions, MapDimensions, MapLocation } from '@cas-hub/acabim-common-client';\nimport { MapStateService } from '../../_services/three-content.service';\nimport CircleStyle from \"ol/style/Circle\";\n\n@Component({\n    selector: 'acaland-map',\n    template: `\n    <div class=\"map-container\">\n      <div id=\"map\"></div>\n    </div>\n  `,\n    styles: [`\n    .map-container {\n      width: 100%;\n      height: 100%;\n      position: relative;\n    }\n    #map {\n      width: 100%;\n      height: 100%;\n    }\n  `]\n})\nexport class CustomAcabimMapComponent implements OnInit, AfterViewInit {\n    // Constants and configuration\n    private readonly primaryColour = 'rgb(87, 115, 164)';\n    private readonly primaryColourA = 'rgba(87, 115, 164, .2)';\n    private readonly secondaryColour = 'rgb(255, 128, 5)';\n    private readonly secondaryColourA = 'rgba(255, 128, 5, .2)';\n    private readonly defaultCentre = fromLonLat([173.2444, -41.2985]);\n    private readonly defaultZoom = 6;\n    private readonly zoomIn = 19;\n    private readonly arcGisUrl = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}';\n    private currentZoomLevel: number = this.defaultZoom;\n\n    // Component inputs\n    @Input() selectedSite: AcabimSite | null = null;\n    @Input() sourceType = 'osm';\n    @Input() subTitle = '';\n    @Input() showSite = false;\n    @Input() displayDetails = true;\n    @Input() addressFinder = false;\n    @Input() mode: 'draw' | 'measure' = 'draw';\n    @ViewChild('mapContainer', { static: true }) mapElementRef!: ElementRef;\n\n    // Component outputs\n    @Output() primaryChanges: EventEmitter<string> = new EventEmitter<string>();\n    @Output() newAddress: EventEmitter<MapLocation | null> = new EventEmitter<MapLocation | null>();\n    @Output() currentZoom: EventEmitter<number> = new EventEmitter<number>();\n\n    // Map state properties\n    public address = '';\n    public centre: Coordinate = this.defaultCentre;\n    public dimensions: MapDimensions = MapDefaultDimensions;\n    public download = false;\n    public name = '';\n    public primarySite: AcabimSite | null = null;\n    public reset = false;\n    public ready = true;\n    public zoom = this.defaultZoom;\n\n    // Map interaction objects\n    private draw: Draw | null = null;\n    private modify: Modify | null = null;\n    private snap: Snap | null = null;\n    private select: Select | null = null;\n\n    // Map elements and layers\n    private mapElement: HTMLElement | null = null;\n    private mapId = 'map';\n    private mapPinId = 'pin-' + this.mapId;\n    private mapObject: Map | null = null;\n    private primarySource: Vector | null = null;\n\n    // Drawing/measurement state\n    private currentMode: 'polygon' | 'line' | 'delete' = 'polygon';\n    private measureTooltipElement: HTMLElement | null = null;\n    private measureTooltip: Overlay | null = null;\n    private deleteMode = false;\n    private labelOverlays: globalThis.Map<Feature, Overlay> = new globalThis.Map();\n\n    private processedFeatures = new Set<Feature>();\n\n    constructor(\n        protected siteApiService: SiteApiService,\n        public mapStateService: MapStateService,\n    ) {}\n\n    // Input setters\n    @Input() set canDownload(value: boolean) {\n        this.download = value;\n    }\n\n    @Input() set canDraw(value: boolean) {\n        if (value) {\n            if (!this.draw) {\n                this.draw = new Draw({\n                    source: this.primarySource || undefined,\n                    type: this.currentMode === 'polygon' ? 'Polygon' : 'LineString',\n                });\n                this.mapObject?.addInteraction(this.draw);\n            }\n        } else if (this.draw) {\n            this.mapObject?.removeInteraction(this.draw);\n            this.draw = null;\n        }\n    }\n\n    @Input() set canReset(value: boolean) {\n        this.reset = value;\n    }\n\n    @Input() set siteDetails(site: AcabimSite) {\n        if (site) {\n            this.name = site.name;\n            this.address = site.address;\n            this.primarySite = site;\n            this.centre = fromLonLat([site.longitude, site.latitude]);\n            this.zoom = this.zoomIn;\n            this.initMap();\n            this.mapObject?.setView(this.setView(this.centre, this.zoom));\n\n            if (this.primarySite.coordinates && this.primarySite.coordinates.length > 0 && this.mapObject) {\n                this.setPolygonLayer([this.primarySite.coordinates]);\n                this.mapStateService.setPrimaryPolygon(this.primarySite.coordinates);\n            }\n            this.updateInteractions();\n        }\n    }\n\n    @Input() set zoomTo(zoom: number) {\n        this.zoom = zoom;\n        if (this.mapObject) {\n            this.mapObject?.setView(this.setView(this.centre, this.zoom));\n        }\n        this.initMap();\n        this.buildPin();\n    }\n\n    @Input() set focus(value: MapConfig | null) {\n        this.handleFocus(value);\n    }\n\n    @Input() set setDimensions(value: MapDimensions) {\n        if (value) {\n            this.dimensions = value;\n        }\n    }\n\n    @Input() set primaryPolygon(value: number[][]) {\n        if (!Array.isArray(value)) {\n            console.error('primaryPolygon must be an array');\n            return;\n        }\n        this.initMap();\n        if (value && value.length > 0 && this.mapObject) {\n            this.mapStateService.setPrimaryPolygon(value);\n            this.setPolygonLayer([value]);\n        }\n    }\n\n    @Input() set secondaryPolygons(value: number[][][]) {\n        if (value && value.length > 0 && this.mapObject) {\n            this.mapStateService.setSecondaryPolygons(value);\n            this.setPolygonLayer(value, 'secondary');\n        }\n    }\n\n    ngOnInit(): void {\n        this.currentMode = 'polygon';\n        this.updateInteractions();\n        if (this.selectedSite) {\n            this.siteApiService.selectedSiteId = this.selectedSite.id;\n        }\n        this.handleKeyboardEvent = this.handleKeyboardEvent.bind(this);\n    }\n\n    ngAfterViewInit(): void {\n        this.initMap();\n        this.buildPin();\n\n        if (this.primarySite?.coordinates?.length) {\n            const validCoords = this.primarySite.coordinates\n                .filter(coord => coord.length >= 2)\n                .map(coord => [coord[0], coord[1]] as [number, number]);\n\n            if (validCoords.length > 0) {\n                this.setPolygonLayer([validCoords]);\n                this.syncPolygonsTo3D();\n            }\n        }\n    }\n\n    ngOnDestroy(): void {\n        if (this.mapObject) {\n            this.mapObject.dispose();\n            this.mapObject = null;\n        }\n        this.labelOverlays.forEach(overlay => {\n            this.mapObject?.removeOverlay(overlay);\n        });\n        this.labelOverlays.clear();\n    }\n\n    // Public methods\n    public handleReset(): void {\n        if (this.mapObject) {\n            this.centre = this.defaultCentre;\n            this.zoom = this.defaultZoom;\n            this.mapObject?.setView(this.setView(this.centre, this.zoom));\n\n            this.mapObject.getAllLayers().map(existing => {\n                const classname = existing.getClassName();\n                if (classname.indexOf('-map-layer') > -1) {\n                    existing.dispose();\n                    existing.changed();\n                }\n            });\n            this.buildPin();\n        }\n    }\n\n    public handleRefresh(): void {\n        if (this.mapObject) {\n            this.mapObject.getAllLayers().forEach((layer) => {\n                if (layer instanceof VectorLayer) {\n                    layer.getSource()?.refresh();\n                }\n            });\n        }\n    }\n\n    public downloadPng(): void {\n        const mapElement = document?.getElementById(this.mapId);\n        if (this.mapObject && this.download && mapElement) {\n            const controls = this.mapObject.getControls();\n            controls.forEach(control => {\n                if (this.mapObject && control instanceof Control.Zoom) {\n                    this.mapObject.removeControl(control);\n                } else if (this.mapObject && control instanceof Control.Attribution) {\n                    this.mapObject.removeControl(control);\n                }\n            });\n            const filename = this.name ? this.name + '.png' : 'download.png';\n            htmlToImage.toPng(mapElement)\n                .then(dataUrl => {\n                    const a = document.createElement('a');\n                    a.href = dataUrl;\n                    a.download = filename;\n                    a.click();\n                    URL.revokeObjectURL(dataUrl);\n                    this.mapObject?.addControl(new Control.Zoom());\n                    this.mapObject?.addControl(new Control.Attribution());\n                });\n            this.mapObject.renderSync();\n        }\n    }\n\n    public handleAddressFinder(value: MapLocation | null): void {\n        if (value) {\n            this.address = value.address;\n            const focus: MapConfig = {\n                zoom: this.zoomIn,\n                centerLatitude: value.latitude,\n                centerLongitude: value.longitude\n            };\n            this.handleFocus(focus);\n            this.newAddress.emit(value);\n        } else {\n            this.address = '';\n            this.newAddress.emit(null);\n            this.handleReset();\n        }\n    }\n\n    // Private methods\n    private initMap(): void {\n        this.mapElement = document?.getElementById(this.mapId);\n        if (this.centre && this.zoom && this.mapElement) {\n            if (!this.mapObject) {\n                this.mapElement.innerHTML = '';\n                this.mapObject = new Map({\n                    target: this.mapId,\n                    layers: [\n                        new TileLayer({\n                            className: 'primaryTileLayer',\n                            source: this.getSource(this.sourceType),\n                        })\n                    ],\n                    view: this.setView(this.centre, this.zoom),\n                });\n\n                this.mapObject.getView().on('change:center', () => {\n                    const center = toLonLat(this.mapObject!.getView().getCenter()!);\n                    this.mapStateService.setCenter([center[0], center[1]]);\n                });\n\n                this.mapObject.getView().on('change:resolution', () => {\n                    this.currentZoomLevel = this.mapObject!.getView().getZoom()!;\n                    this.updateLabelSizes();\n                    this.mapStateService.setZoom(this.currentZoomLevel);\n                    // Calculate resolution based on zoom level (in meters per pixel for EPSG:3857)\n                    const resolution = 156543.03392804097 / Math.pow(2, this.currentZoomLevel); // Standard formula for Web Mercator\n                    this.mapStateService.setResolution(resolution);\n                });\n\n                this.ready = true;\n            }\n        } else {\n            this.mapObject?.setView(this.setView(this.centre, this.zoom));\n            this.buildPin();\n        }\n        this.updateInteractions();\n\n        if (this.mapStateService.polygons.length === 0) {\n            if (this.selectedSite?.coordinates?.length) {\n                const validCoordinates = this.selectedSite.coordinates\n                    .filter(coord => Array.isArray(coord) && coord.length >= 2)\n                    .map(coord => [coord[0], coord[1]] as [number, number]);\n\n                if (validCoordinates.length > 0) {\n                    this.mapStateService.polygons.push({\n                        coordinates: validCoordinates,\n                        isNew: true\n                    });\n                } else {\n                    console.warn('No valid coordinates found in selectedSite');\n                }\n            } else if (this.mapObject) {\n                const center = toLonLat(this.mapObject.getView().getCenter()!);\n                const offset = 0.0005;\n\n                this.mapStateService.polygons.push({\n                    coordinates: [\n                        [center[0] - offset, center[1] - offset],\n                        [center[0] + offset, center[1] - offset],\n                        [center[0] + offset, center[1] + offset],\n                        [center[0] - offset, center[1] + offset],\n                        [center[0] - offset, center[1] - offset]\n                    ],\n                    isNew: true\n                });\n            }\n        }\n    }\n    private updateLabelSizes(): void {\n        const baseSize = 12; // Base font size at default zoom\n        const zoomFactor = Math.max(1, this.currentZoomLevel / this.defaultZoom);\n        const fontSize = Math.min(16, Math.max(10, baseSize * zoomFactor)); // Clamp between 10-16px\n\n        this.labelOverlays.forEach((overlay) => {\n            const element = overlay.getElement();\n            if (element) {\n                const areaElement = element.firstElementChild as HTMLElement;\n                const perimeterElement = element.lastElementChild as HTMLElement;\n\n                if (areaElement) {\n                    areaElement.style.fontSize = `${fontSize}px`;\n                }\n                if (perimeterElement) {\n                    perimeterElement.style.fontSize = `${fontSize}px`;\n                }\n            }\n        });\n    }\n\n    private setView(centre: Coordinate, zoom: number, result: boolean = true): View {\n        const view = new View({\n            center: centre,\n            zoom,\n        });\n        if (!result) {\n            this.mapObject?.setView(view);\n        }\n        this.currentZoom.emit(zoom);\n        return view;\n    }\n\n    private setPolygonLayer(polygonCoordinates: number[][][], display: string = 'primary'): void {\n        const polygonClass = display + '-map-layer';\n\n        if (this.mapObject) {\n            let existingLayer: any | null = null;\n\n            this.mapObject.getAllLayers().forEach(existing => {\n                if (existing.getClassName() === polygonClass) {\n                    existingLayer = existing;\n                }\n            });\n\n            const isPrimary = display == 'primary';\n            const polygonSource = this.buildPolygonSource(polygonCoordinates, isPrimary);\n            const selectedStyle = display === 'primary' ?\n                this.setPrimaryPolygonStyle() : this.setSecondaryPolygonStyle();\n\n            if (existingLayer) {\n                existingLayer.setSource(polygonSource);\n                existingLayer.changed();\n            } else {\n                const polygonLayer = new VectorLayer({\n                    source: polygonSource,\n                    className: polygonClass,\n                    style: selectedStyle\n                });\n                this.mapObject.addLayer(polygonLayer);\n            }\n\n            if (display === 'primary') {\n                this.primarySource = polygonSource;\n                if (this.draw) {\n                    this.updateInteractions();\n                }\n                this.buildPin();\n            }\n\n            this.addPolygonMeasureOverlay(polygonSource, display);\n        }\n    }\n\n    private isCounterClockwise(coordinates: number[][]): boolean {\n        let sum = 0;\n        for (let i = 0; i < coordinates.length - 1; i++) {\n            const [x1, y1] = coordinates[i];\n            const [x2, y2] = coordinates[i + 1];\n            sum += (x2 - x1) * (y2 + y1);\n        }\n        return sum > 0;\n    }\n\n    private addPolygonMeasureOverlay(source: Vector, display: string): void {\n        source.getFeatures().forEach((feature, index) => {\n            if (this.processedFeatures.has(feature)) return;\n            this.processedFeatures.add(feature);\n            const geometry = feature.getGeometry();\n\n            if (geometry && geometry.getType() === 'Polygon') {\n                const polygon = geometry as Polygon;\n                const rings = polygon.getCoordinates();\n\n                rings.forEach((ring, index) => {\n                    if (ring.length < 4) {\n                        console.warn(`Skipping invalid ring ${index + 1}, not enough points.`);\n                        return;\n                    }\n\n                    if (!this.isCounterClockwise(ring)) {\n                        ring.reverse();\n                    }\n\n                    const area = this.formatArea(new Polygon([ring]));\n                    const perimeter = getLength(new LineString(ring)).toFixed(2) + ' m';\n                    const interiorPoint = new Polygon([ring]).getInteriorPoint();\n                    const centroid = interiorPoint.getCoordinates();\n                    const labelElement = this.createLabel(area, perimeter, feature);\n\n                    this.mapObject?.addOverlay(\n                        new Overlay({\n                            element: labelElement,\n                            position: centroid,\n                            positioning: 'center-center',\n                        })\n                    );\n                });\n            } else {\n                console.warn(`Unexpected geometry type: ${geometry?.getType()}`);\n            }\n        });\n    }\n\n    private buildPin(): void {\n        if (this.mapObject && this.mapPinId) {\n            const pinElement = document.getElementById(this.mapPinId) ?? undefined;\n            const pinOverlay = this.mapObject.getOverlayById('cas-pin');\n\n            if (pinElement) {\n                if (pinOverlay) {\n                    pinOverlay.setPosition(this.centre);\n                    pinOverlay.changed();\n                } else {\n                    const pin = new Overlay({\n                        id: 'cas-pin',\n                        position: this.centre,\n                        element: document.getElementById(this.mapPinId) ?? undefined,\n                    });\n                    this.mapObject.addOverlay(pin);\n                }\n            }\n        }\n    }\n\n    private getSource(type: string): any {\n        return type === 'arcgis' ?\n            new XYZ({\n                attributions: 'Tiles &copy; <a href=\"https://services.arcgisonline.com/ArcGIS/' +\n                    'rest/services/World_Topo_Map/MapServer\">ArcGIS</a>',\n                url: this.arcGisUrl,\n            }) :\n            new OSM();\n    }\n\n    private setPrimaryPolygonStyle(): Style {\n        return new Style({\n            fill: new Fill({\n                color: this.primaryColourA\n            }),\n            stroke: new Stroke({\n                color: this.primaryColour,\n                width: 1.5,\n            }),\n        });\n    }\n\n    private setSecondaryPolygonStyle(): Style {\n        return new Style({\n            fill: new Fill({\n                color: this.secondaryColourA\n            }),\n            stroke: new Stroke({\n                color: this.secondaryColour,\n                width: 1.5,\n            }),\n        });\n    }\n\n    private buildPolygonSource(polygonCoordinates: number[][][], isPrimary: boolean = false): Vector {\n        const polygonFeature = {\n            type: 'FeatureCollection',\n            features: [{\n                type: 'Feature',\n                geometry: {\n                    type: 'Polygon',\n                    coordinates: polygonCoordinates,\n                },\n                properties: {\n                    id: 'mapPolygons',\n                    isPrimary: isPrimary\n                },\n            }],\n        };\n\n        return new Vector({\n            features: (new GeoJSON()).readFeatures(polygonFeature, {\n                dataProjection: 'EPSG:4326',\n                featureProjection: 'EPSG:3857'\n            }),\n        });\n    }\n\n    private handleFocus(value: MapConfig | null): void {\n        if (value) {\n            const lonLat: [number, number] = [value.centerLongitude, value.centerLatitude];\n            this.centre = fromLonLat(lonLat);\n            this.mapStateService.setCenter(lonLat);\n            this.mapStateService.setZoom(value.zoom);\n            this.zoom = value.zoom;\n        } else {\n            this.centre = this.defaultCentre;\n            this.zoom = this.defaultZoom;\n        }\n\n        if (this.mapObject) {\n            this.mapObject?.setView(this.setView(this.centre, this.zoom));\n        }\n        this.initMap();\n        this.buildPin();\n    }\n\n    private updateInteractions(): void {\n        // Remove existing interactions\n        if (this.draw) {\n            this.mapObject?.removeInteraction(this.draw);\n            this.draw = null;\n        }\n        if (this.modify) {\n            this.mapObject?.removeInteraction(this.modify);\n            this.modify = null;\n        }\n        if (this.snap) {\n            this.mapObject?.removeInteraction(this.snap);\n            this.snap = null;\n        }\n        if (this.select) {\n            this.mapObject?.removeInteraction(this.select);\n            this.select = null;\n        }\n\n        // Handle delete mode\n        if (this.deleteMode) {\n            this.select = new Select();\n            this.mapObject?.addInteraction(this.select);\n\n            const selectedFeatures = this.select.getFeatures();\n            selectedFeatures.on('add', (event) => {\n                const feature = event.target.item(0);\n                if (feature) {\n                    const geometry = feature.getGeometry();\n                    if (geometry && (geometry.getType() === 'Polygon' || geometry.getType() === 'LineString')) {\n                        this.removeLabelForFeature(feature);\n                        this.primarySource?.removeFeature(feature);\n                        this.syncPolygonsTo3D();\n                    }\n                }\n            });\n            return;\n        }\n\n        // Add Modify interaction (if primarySource exists)\n        if (this.primarySource && this.primarySource.getFeatures().length > 0) {\n            this.modify = new Modify({\n                source: this.primarySource,\n                style: new Style({\n                    fill: new Fill({\n                        color: 'rgba(255, 255, 255, 0.5)'\n                    }),\n                    stroke: new Stroke({\n                        color: 'rgba(0, 0, 0, 0.7)',\n                        width: 2\n                    }),\n                    image: new CircleStyle({\n                        radius: 7,\n                        fill: new Fill({\n                            color: 'rgba(0, 0, 0, 0.7)'\n                        }),\n                        stroke: new Stroke({\n                            color: 'rgba(255, 255, 255, 0.5)',\n                            width: 1.5\n                        })\n                    })\n                })\n            });\n\n            this.modify.on('modifystart', (evt) => {\n                // Store the original geometry in case we need to revert\n                const feature = evt.features.item(0);\n                if (feature) {\n                    feature.set('originalGeometry', feature.getGeometry()?.clone());\n                }\n            });\n\n            this.modify.on('modifyend', (evt) => {\n                const feature = evt.features.item(0);\n                if (feature) {\n                    // Update the label for the modified feature\n                    this.updateLabelForFeature(feature);\n                    this.syncPolygonsTo3D();\n                }\n            });\n\n            this.mapObject?.addInteraction(this.modify);\n\n            // Add snap interaction for better UX\n            this.snap = new Snap({\n                source: this.primarySource\n            });\n            this.mapObject?.addInteraction(this.snap);\n        }\n\n        // Add Snap interaction for better UX\n        if (!this.snap && this.primarySource) {\n            this.snap = new Snap({\n                source: this.primarySource\n            });\n            this.mapObject?.addInteraction(this.snap);\n        }\n\n        // Handle polygon draw mode\n        if (this.currentMode === 'polygon') {\n            this.draw = new Draw({\n                source: this.primarySource || undefined,\n                type: 'Polygon',\n            });\n\n            this.draw.on('drawstart', () => {\n                this.createMeasureTooltip();\n            });\n\n            this.draw.on('drawend', (event) => {\n                const feature = event.feature;\n                const geometry = feature.getGeometry();\n\n                if (geometry && geometry.getType() === 'Polygon') {\n                    const polygon = geometry as Polygon;\n                    const area = this.formatArea(polygon);\n                    const ringCoordinates = polygon.getCoordinates()[0];\n                    const lineString = new LineString(ringCoordinates);\n                    const perimeter = getLength(lineString).toFixed(2) + ' m';\n                    const interiorPoint = polygon.getInteriorPoint();\n                    const centroid = interiorPoint.getCoordinates();\n                    const labelElement = this.createLabel(area, perimeter, feature);\n\n                    this.mapObject?.addOverlay(new Overlay({\n                        element: labelElement,\n                        position: centroid,\n                        positioning: 'center-center',\n                    }));\n\n                    this.syncPolygonsTo3D();\n                }\n            });\n\n            this.mapObject?.addInteraction(this.draw);\n            return;\n        }\n\n        // Handle line draw mode\n        if (this.currentMode === 'line') {\n            this.draw = new Draw({\n                source: this.primarySource || undefined,\n                type: 'LineString',\n                maxPoints: 2,\n                style: new Style({\n                    stroke: new Stroke({\n                        color: 'red',\n                        width: 2,\n                        lineDash: [4, 8],\n                    }),\n                }),\n            });\n\n            this.draw.on('drawstart', (event) => {\n                this.createMeasureTooltip();\n                const feature = event.feature;\n                feature.getGeometry()?.on('change', (evt) => {\n                    const geom = evt.target as LineString;\n                    if (geom) {\n                        const length = getLength(geom);\n                        const tooltipCoord = geom.getLastCoordinate();\n                        this.updateTooltip(length, tooltipCoord);\n                    }\n                });\n            });\n\n            this.draw.on('drawend', (event) => {\n                const feature = event.feature;\n                const geometry = feature.getGeometry() as LineString;\n\n                if (geometry && geometry.getCoordinates().length >= 2) {\n                    const length = getLength(geometry);\n                    const distanceString = `${length.toFixed(3)} m`;\n\n                    if (this.measureTooltip) {\n                        this.mapObject?.removeOverlay(this.measureTooltip);\n                        this.measureTooltip = null;\n                        this.measureTooltipElement = null;\n                    }\n\n                    const coords = geometry.getCoordinates();\n                    const midpoint = [\n                        (coords[0][0] + coords[1][0]) / 2,\n                        (coords[0][1] + coords[1][1]) / 2,\n                    ];\n\n                    const labelOverlay = new Overlay({\n                        element: this.createLabel(distanceString, '', feature),\n                        position: midpoint,\n                        positioning: 'center-center',\n                    });\n\n                    this.mapObject?.addOverlay(labelOverlay);\n\n                    feature.setStyle(new Style({\n                        stroke: new Stroke({\n                            color: 'red',\n                            width: 2,\n                            lineDash: [4, 8],\n                        }),\n                    }));\n\n                    setTimeout(() => {\n                        if (this.draw) {\n                            this.mapObject?.removeInteraction(this.draw);\n                            this.draw = null;\n                        }\n                    }, 100);\n                }\n            });\n\n            this.mapObject?.addInteraction(this.draw);\n        }\n    }\n\n    private updateLabelForFeature(feature: Feature): void {\n        const geometry = feature.getGeometry();\n        if (!geometry) return;\n\n        // Remove the old label\n        this.removeLabelForFeature(feature);\n\n        // Create a new label based on the modified geometry\n        if (geometry.getType() === 'Polygon') {\n            const polygon = geometry as Polygon;\n            const area = this.formatArea(polygon);\n            const ringCoordinates = polygon.getCoordinates()[0];\n            const lineString = new LineString(ringCoordinates);\n            const perimeter = getLength(lineString).toFixed(2) + ' m';\n            const interiorPoint = polygon.getInteriorPoint();\n            const centroid = interiorPoint.getCoordinates();\n            const labelElement = this.createLabel(area, perimeter, feature);\n\n            this.mapObject?.addOverlay(new Overlay({\n                element: labelElement,\n                position: centroid,\n                positioning: 'center-center',\n            }));\n        } else if (geometry.getType() === 'LineString') {\n            const lineString = geometry as LineString;\n            const length = getLength(lineString).toFixed(2) + ' m';\n            const coords = lineString.getCoordinates();\n            const midpoint = [\n                (coords[0][0] + coords[1][0]) / 2,\n                (coords[0][1] + coords[1][1]) / 2,\n            ];\n            const labelElement = this.createLabel(length, '', feature);\n\n            this.mapObject?.addOverlay(new Overlay({\n                element: labelElement,\n                position: midpoint,\n                positioning: 'center-center',\n            }));\n        }\n    }\n\n    private syncPolygonsTo3D(): void {\n        if (!this.mapObject || !this.primarySource) {\n            console.error('Map or primary source not initialized');\n            return;\n        }\n\n        setTimeout(() => {\n            const allFeatures = this.primarySource?.getFeatures();\n            if (!allFeatures || allFeatures.length === 0) {\n                console.warn('No features found in primary source');\n                return;\n            }\n\n            let primaryPolygonProcessed = false;\n\n            const polygonsFor3D = allFeatures\n                .map(f => {\n                    try {\n                        const geom = f.getGeometry() as Polygon;\n                        if (!geom || geom.getType() !== 'Polygon') return null;\n\n                        // Get coordinates in EPSG:3857 (Web Mercator)\n                        const coords = geom.getCoordinates()[0];\n                        if (!coords || coords.length < 3) return null;\n\n                        // Convert to array of [x,y] pairs (already in Web Mercator)\n                        const mercCoords = coords.map(coord => [coord[0], coord[1]] as [number, number]);\n\n                        const isPrimary = !primaryPolygonProcessed;\n                        primaryPolygonProcessed = true;\n\n                        return {\n                            coordinates: mercCoords,\n                            height: isPrimary ? 1.8 : 3,\n                            color: '#5773a4',\n                            opacity: isPrimary ? 0.75 : 1,\n                            isPrimary: isPrimary\n                        };\n                    } catch (e) {\n                        console.error('Error processing feature:', e);\n                        return null;\n                    }\n                })\n                .filter(p => p !== null) as Array<{\n                coordinates: [number, number][];\n                height: number;\n                color: string | number;\n                opacity?: number;\n                isPrimary: boolean;\n            }>;\n\n            console.log('Sending polygons to 3D:', polygonsFor3D);\n            this.mapStateService.setPolygonsFor3D([...polygonsFor3D]);\n        }, 0);\n    }\n\n    private updateTooltip(length: number, position: number[]): void {\n        if (this.measureTooltipElement && this.measureTooltip) {\n            this.measureTooltipElement.innerHTML = `${length.toFixed(2)} m`;\n            this.measureTooltip.setPosition(position);\n        }\n    }\n\n    private removeLabelForFeature(feature: Feature): void {\n        const labelOverlay = this.labelOverlays.get(feature);\n        if (labelOverlay) {\n            this.mapObject?.removeOverlay(labelOverlay);\n            this.labelOverlays.delete(feature);\n            const labelElement = labelOverlay.getElement();\n            if (labelElement && labelElement.parentNode) {\n                labelElement.parentNode.removeChild(labelElement);\n            }\n            setTimeout(() => this.mapObject?.updateSize(), 0);\n        }\n    }\n\n    private createLabel(area: string, perimeter: string, feature: Feature): HTMLElement {\n        const label = document.createElement('div');\n        label.className = 'distance-label';\n\n        const isPrimary = feature.get('isPrimary') || false;\n        const baseFontSize = 10;\n\n        // Area\n        const areaElement = document.createElement('div');\n        areaElement.innerHTML = area;\n        areaElement.style.fontSize = `${baseFontSize}px`;\n        areaElement.style.color = 'black';\n        areaElement.style.fontWeight = isPrimary ? 'bold' : 'normal';\n        areaElement.style.lineHeight = '1';\n\n        // Perimeter\n        const perimeterElement = document.createElement('div');\n        perimeterElement.innerHTML = perimeter;\n        perimeterElement.style.fontSize = `${baseFontSize}px`;\n        perimeterElement.style.color = 'black';\n        perimeterElement.style.fontWeight = isPrimary ? 'bold' : 'normal';\n        areaElement.style.lineHeight = '1';\n        perimeterElement.style.marginTop = '1px';\n\n        label.appendChild(areaElement);\n        label.appendChild(perimeterElement);\n\n        // label.style.backgroundColor = 'rgba(255, 255, 255, 0.7)';\n        label.style.backgroundColor = 'transparent';\n        label.style.padding = '0';\n        label.style.borderRadius = '0';\n        label.style.fontSize = '12px';\n        label.style.color = 'black';\n        label.style.textAlign = 'center';\n        label.style.border = 'none';\n        label.style.boxShadow = 'none';\n        label.style.lineHeight = '1.2';\n\n        const labelOverlay = new Overlay({\n            element: label,\n            position: [0, 0],\n            positioning: 'center-center',\n        });\n\n        this.mapObject?.addOverlay(labelOverlay);\n        this.labelOverlays.set(feature, labelOverlay);\n\n        return label;\n    }\n\n    private createMeasureTooltip(): void {\n        if (!this.measureTooltipElement) {\n            this.measureTooltipElement = document.createElement('div');\n            this.measureTooltipElement.className = 'ol-tooltip ol-tooltip-measure';\n            this.mapObject?.getOverlayContainer().appendChild(this.measureTooltipElement);\n            this.measureTooltip = new Overlay({\n                element: this.measureTooltipElement,\n                offset: [0, -15],\n                positioning: 'bottom-center',\n            });\n        }\n        if (this.measureTooltip) {\n            this.mapObject?.addOverlay(this.measureTooltip);\n        }\n    }\n\n    private formatArea(geometry: Polygon): string {\n        const area = getArea(geometry);\n        return area > 100000 ?\n            (area / 1000000).toFixed(2) + ' km²' :\n            area.toFixed(2) + ' m²';\n    }\n\n    @HostListener('document:keydown', ['$event'])\n    private handleKeyboardEvent(event: KeyboardEvent): void {\n        if (event.key === 'm' || event.key === 'M') {\n            this.currentMode = 'line';\n            this.deleteMode = false;\n        } else if (event.key === 'p' || event.key === 'P') {\n            this.currentMode = 'polygon';\n            this.deleteMode = false;\n        } else if (event.key === 'd' || event.key === 'D') {\n            this.deleteMode = true;\n            this.currentMode = 'delete';\n        } else if (event.key === 'Escape') {\n            if (this.draw) {\n                this.mapObject?.removeInteraction(this.draw);\n                this.draw = null;\n            }\n            this.deleteMode = false;\n            return;\n        }\n        this.updateInteractions();\n    }\n}\n","import {Component, ElementRef, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\nimport { fromLonLat } from 'ol/proj';\nimport { MapStateService } from '../../_services/three-content.service';\n// import {EffectComposer} from 'three/examples/jsm/postprocessing/EffectComposer';\n\n\n@Component({\n    selector: 'app-map3d',\n    templateUrl: './map-viewer.component.html',\n    styleUrls: ['./map-viewer.component.scss']\n})\nexport class Map3DComponent implements OnInit, OnDestroy {\n    // ViewChild and Properties\n    @ViewChild('rendererContainer', { static: true }) rendererContainer!: ElementRef;\n\n    @Input() enableKeyboardControls = true;\n\n    private scene!: THREE.Scene;\n    private camera!: THREE.PerspectiveCamera;\n    private renderer!: THREE.WebGLRenderer;\n    private controls!: OrbitControls;\n    private meshes: THREE.Mesh[] = [];\n    private animationFrameId!: number;\n    private polygonSubscription!: Subscription;\n    private keysPressed: { [key: string]: boolean } = {};\n    private moveSpeed = 10;\n    private lastTime = 0;\n    // private updatePending = false;\n    private tileSize!: number;\n    // push-pull variables\n    private raycaster = new THREE.Raycaster();\n    private mouse = new THREE.Vector2();\n    private selectedPolygon: THREE.Mesh | null = null;\n    private minHeight = 0.5;\n    private maxHeight = 50;\n\n    private heightHistory: {index: number, height: number}[] = [];\n    private historyPointer = -1;\n    private snappingEnabled = true;\n\n    public sunPosition = { azimuth: 135, elevation: 60 };\n    private sunLight!: THREE.DirectionalLight;\n\n    private textLabels: THREE.Object3D[] = [];\n\n    constructor(public mapStateService: MapStateService) {}\n\n    // Lifecycle Hooks\n    ngOnInit(): void {\n        this.initScene();\n        this.animate(0);\n        this.debugAlignmentOffset();\n        this.setupSubscriptions();\n        this.setupEventListeners();\n    }\n\n    ngOnDestroy(): void {\n        this.cleanup();\n    }\n\n    public updateSunPosition(): void {\n        // Convert azimuth and elevation to position\n        const azimuthRad = THREE.MathUtils.degToRad(this.sunPosition.azimuth);\n        const elevationRad = THREE.MathUtils.degToRad(this.sunPosition.elevation);\n\n        const distance = 1000; // Distance from scene center\n        const x = distance * Math.cos(elevationRad) * Math.sin(azimuthRad);\n        const y = distance * Math.sin(elevationRad);\n        const z = distance * Math.cos(elevationRad) * Math.cos(azimuthRad);\n\n        this.sunLight.position.set(x, y, z);\n        this.sunLight.lookAt(0, 0, 0);\n    }\n\n    public setSunForAucklandTime(time: Date): void {\n        // This is a simplified calculation - for accurate results use a library like 'suncalc'\n        const hours = time.getHours();\n\n        // Simple approximation:\n        this.sunPosition.azimuth = (hours / 24) * 360; // 0-360° through the day\n        this.sunPosition.elevation = Math.max(0, 90 - Math.abs(12 - hours) * 7.5); // Peaks at noon\n\n        this.updateSunPosition();\n    }\n\n    // Initialization Methods\n    private initScene(): void {\n        const width = this.rendererContainer.nativeElement.clientWidth;\n        const height = this.rendererContainer.nativeElement.clientHeight;\n\n        // Renderer setup\n        this.renderer = new THREE.WebGLRenderer({\n            antialias: true,\n            // preserveDrawingBuffer: true\n        });\n        this.renderer.setPixelRatio(window.devicePixelRatio);\n        this.renderer.sortObjects = false;\n        this.renderer.localClippingEnabled = true;\n        this.renderer.setSize(width, height);\n        this.renderer.shadowMap.enabled = true;\n        this.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\n        this.rendererContainer.nativeElement.appendChild(this.renderer.domElement);\n\n        // Scene setup\n        this.scene = new THREE.Scene();\n        // clear sky background (RGB: 135, 206, 235)\n        this.scene.background = new THREE.Color(0x87CEEB);\n\n        // SUNLIGHT - Main directional light (sun)\n        this.sunLight = new THREE.DirectionalLight(0xFFFDF0, 1.5);\n        this.sunLight.position.set(0, 0, 0);\n        this.updateSunPosition(); // Call this after setting up the light\n        // this.sunLight.position.set(500, 1000, 500);\n\n        this.sunLight.castShadow = true;\n\n        // Shadow quality settings\n        this.sunLight.shadow.mapSize.width = 4096;\n        this.sunLight.shadow.mapSize.height = 4096;\n        this.sunLight.shadow.camera.near = 0.5;\n        this.sunLight.shadow.camera.far = 2000;\n        this.sunLight.shadow.camera.left = -500;\n        this.sunLight.shadow.camera.right = 500;\n        this.sunLight.shadow.camera.top = 500;\n        this.sunLight.shadow.camera.bottom = -500;\n        this.sunLight.shadow.bias = -0.0001;\n\n        this.scene.add(this.sunLight);\n\n\n        // AMBIENT LIGHT - Soft overall illumination\n        // const ambientLight = new THREE.AmbientLight(0xffffff, 0.7);\n        const ambientLight = new THREE.AmbientLight(0xffffff, 0.4);\n        this.scene.add(ambientLight);\n\n        // FILL LIGHT - Reduces harsh shadows\n        const fillLight = new THREE.DirectionalLight(0xffffff, 0.3);\n        fillLight.position.set(-500, 500, -500);\n        this.scene.add(fillLight);\n\n        // Add ground plane (for shadows)\n        const groundGeometry = new THREE.PlaneGeometry(5000, 5000);\n        const groundMaterial = new THREE.MeshPhongMaterial({\n            color: 0xdddddd,\n            side: THREE.DoubleSide,\n            shadowSide: THREE.DoubleSide\n        });\n        const ground = new THREE.Mesh(groundGeometry, groundMaterial);\n        ground.rotation.x = -Math.PI / 2;\n        ground.position.y = 0;\n        ground.receiveShadow = true;\n        this.scene.add(ground);\n        this.meshes.push(ground);\n\n        // set up ground grid here, if required\n\n        //test cube\n        /*\n        const testCube = new THREE.Mesh(\n            new THREE.BoxGeometry(50, 50, 50),\n            new THREE.MeshStandardMaterial({ color: 0xff0000 })\n        );\n        testCube.position.set(0, 25, 0);\n        testCube.castShadow = true;\n        this.scene.add(testCube);\n         */\n\n        // Camera setup\n        this.camera = new THREE.PerspectiveCamera(60, width / height, 1, 100000);\n        this.camera.position.set(0, 1000, 1000);\n        this.camera.lookAt(new THREE.Vector3(0, 0, 0));\n\n        // Controls setup\n        this.controls = new OrbitControls(this.camera, this.renderer.domElement);\n        this.controls.enableDamping = true;\n        this.controls.dampingFactor = 0.05;\n        this.controls.screenSpacePanning = false;\n        this.controls.maxPolarAngle = Math.PI / 2;\n\n        // Add reference point at origin of primary polygon\n        // the origin is not at the right location\n        // TO DO\n        // Add axes (X=red, Y=green, Z=blue)\n        /*\n        const axesHelper = new THREE.AxesHelper(80);\n        this.scene.add(axesHelper);\n\n        // Add labels to axes\n        const addAxisLabel = (axis: string, position: THREE.Vector3, color: number) => {\n            const canvas = document.createElement('canvas');\n            canvas.width = 64;\n            canvas.height = 64;\n            const context = canvas.getContext('2d')!;\n            context.fillStyle = `#${color.toString(16).padStart(6, '0')}`;\n            context.font = '18px Arial';\n            context.fillText(axis, 10, 40);\n\n            const texture = new THREE.CanvasTexture(canvas);\n            const material = new THREE.SpriteMaterial({ map: texture });\n            const sprite = new THREE.Sprite(material);\n            sprite.position.copy(position);\n            this.scene.add(sprite);\n        };\n\n        addAxisLabel('X', new THREE.Vector3(90, 0, 0), 0xff0000); // Red X\n        addAxisLabel('Y', new THREE.Vector3(0, 90, 0), 0x00ff00); // Green Y\n        addAxisLabel('Z', new THREE.Vector3(0, 0, 90), 0x0000ff); // Blue Z\n\n        /*\n        const originMarker = new THREE.Mesh(\n            new THREE.SphereGeometry(2, 8, 8),\n            new THREE.MeshBasicMaterial({ color: 0x555555 })\n        );\n        originMarker.position.y = 0.1;\n        this.scene.add(originMarker);\n        */\n\n        console.log('Scene initialised with debug helpers');\n\n        /*\n        // Add EffectComposer for outline effects\n        this.composer = new EffectComposer(this.renderer);\n        this.composer.addPass(new RenderPass(this.scene, this.camera));\n\n        const outlinePass = new OutlinePass(\n            new THREE.Vector2(window.innerWidth, window.innerHeight),\n            this.scene,\n            this.camera\n        );\n        outlinePass.edgeStrength = 3.0;\n        outlinePass.edgeGlow = 0.5;\n        outlinePass.edgeThickness = 1.0;\n        outlinePass.pulsePeriod = 0;\n        this.composer.addPass(outlinePass);\n        this.outlinePass = outlinePass;\n         */\n    }\n\n    private createTextLabel(text: string, position: THREE.Vector3, color: string = '#000000'): THREE.Sprite {\n        // Create canvas element\n        const canvas = document.createElement('canvas');\n        const context = canvas.getContext('2d')!;\n\n        // Set canvas size (power of two for better texture handling)\n        canvas.width = 512;\n        canvas.height = 256;\n\n        // Background (optional)\n        context.fillStyle = 'rgba(255, 255, 255, 0.7)';\n        context.fillRect(0, 0, canvas.width, canvas.height);\n\n        // Text style\n        context.font = 'Bold 24px Arial';\n        context.fillStyle = color;\n        context.textAlign = 'center';\n        context.textBaseline = 'middle';\n\n        // Draw text\n        const lines = text.split('\\n');\n        const lineHeight = 30;\n        lines.forEach((line, i) => {\n            context.fillText(\n                line,\n                canvas.width / 2,\n                canvas.height / 2 + (i - (lines.length - 1) / 2) * lineHeight\n            );\n        });\n\n        // Create texture from canvas\n        const texture = new THREE.CanvasTexture(canvas);\n        const material = new THREE.SpriteMaterial({\n            map: texture,\n            transparent: true,\n            depthTest: false\n        });\n\n        // Create sprite\n        const sprite = new THREE.Sprite(material);\n        sprite.position.copy(position);\n\n        // Scale to appropriate size in 3D space\n        const labelScale = 0.8; // Adjust based on your scene scale\n        sprite.scale.set(\n            canvas.width * labelScale / 100,\n            canvas.height * labelScale / 100,\n            1\n        );\n\n        return sprite;\n    }\n\n    private updateAllLabels(): void {\n        // Clear existing labels\n        this.textLabels.forEach(label => this.scene.remove(label));\n        this.textLabels = [];\n\n        // Find primary polygon if it exists\n        const primaryPolygon = this.meshes.find(mesh => mesh.userData.isPrimary);\n\n        this.meshes.forEach(mesh => {\n            if (!mesh.userData.isPolygon) return;\n\n            // Calculate dimensions\n            mesh.geometry.computeBoundingBox();\n            const bbox = mesh.geometry.boundingBox;\n            if (!bbox) return;\n\n            const width = (bbox.max.x - bbox.min.x).toFixed(1);\n            const depth = (bbox.max.z - bbox.min.z).toFixed(1);\n            const height = mesh.userData.height.toFixed(1);\n\n            // Position for dimension label\n            const worldPosition = new THREE.Vector3();\n            mesh.getWorldPosition(worldPosition);\n            const labelPosition = new THREE.Vector3(\n                worldPosition.x,\n                mesh.userData.height + 5, // Position above the building\n                worldPosition.z\n            );\n\n            // Create dimension label\n            const dimensionLabel = this.createTextLabel(\n                `Width: ${width}m\\nDepth: ${depth}m\\nHeight: ${height}m`,\n                labelPosition\n            );\n            this.scene.add(dimensionLabel);\n            this.textLabels.push(dimensionLabel);\n\n            // Add distance to primary polygon if applicable\n            if (primaryPolygon && !mesh.userData.isPrimary) {\n                const primaryPosition = new THREE.Vector3();\n                primaryPolygon.getWorldPosition(primaryPosition);\n                const distance = worldPosition.distanceTo(primaryPosition).toFixed(1);\n\n                const distancePosition = labelPosition.clone();\n                distancePosition.y += 10; // Position above dimension label\n\n                const distanceLabel = this.createTextLabel(\n                    `Distance to Primary: ${distance}m`,\n                    distancePosition,\n                    '#FF0000' // Red color for distance\n                );\n                this.scene.add(distanceLabel);\n                this.textLabels.push(distanceLabel);\n            }\n        });\n    }\n\n    // In map-viewer.component.ts - setupSubscriptions()\n    private setupSubscriptions(): void {\n        this.polygonSubscription = this.mapStateService.polygonsFor3D$.subscribe(polygons => {\n            console.log('3D component received polygons:', polygons);\n            if (polygons && polygons.length > 0) {\n                this.addOSMTilesAndPolygons(polygons);\n            } else {\n                console.warn('Received empty polygons array');\n            }\n        });\n\n        // Force initial sync\n        const initialPolygons = this.mapStateService.getCurrentPolygonsFor3D();\n        if (initialPolygons && initialPolygons.length > 0) {\n            this.addOSMTilesAndPolygons(initialPolygons);\n        }\n    }\n\n    private setupEventListeners(): void {\n        window.addEventListener('keydown', this.onKeyDown.bind(this));\n        window.addEventListener('keyup', this.onKeyUp.bind(this));\n        window.addEventListener('resize', this.onWindowResize.bind(this));\n\n        this.renderer.domElement.addEventListener('click', this.onClick.bind(this));\n    }\n\n    private toggleSnapping(): void {\n        this.snappingEnabled = !this.snappingEnabled;\n        console.log(`Snapping ${this.snappingEnabled ? 'enabled' : 'disabled'}`);\n    }\n\n\n    private highlightObject(object: THREE.Mesh): void {\n        const highlightColor = 0xffff00; // Yellow\n        // const edgeColor = 0xff0000; // Red\n        if (Array.isArray(object.material)) {\n            object.material.forEach(mat => {\n                if (mat instanceof THREE.MeshPhongMaterial) {\n                    mat.color.set(highlightColor);\n                    mat.emissive.set(highlightColor);\n                    mat.emissiveIntensity = 0.3; // Yellow highlight\n                    mat.needsUpdate = true;\n                }\n            });\n        } /* else if (object.material instanceof THREE.MeshPhongMaterial) {\n            object.material.color.set(0xffff00);\n            object.material.needsUpdate = true;\n        }\n        */\n    }\n\n    private resetObjectColor(object: THREE.Mesh): void {\n        const originalColor = object.userData.color || 0x5773a4;\n\n        if (Array.isArray(object.material)) {\n            object.material.forEach(mat => {\n                if (mat instanceof THREE.MeshPhongMaterial) {\n                    mat.color.setHex(originalColor);\n                    mat.emissive.setHex(0x000000);\n                    mat.emissiveIntensity = 0;\n                    mat.needsUpdate = true;\n                }\n            });\n        } /* else if (object.material instanceof THREE.MeshPhongMaterial) {\n            object.material.color.setHex(originalColor);\n            object.material.needsUpdate = true;\n        }\n        */\n    }\n\n    private createHeightIndicator(mesh: THREE.Mesh): void {\n        const height = mesh.userData.height;\n        const indicator = new THREE.Line(\n            new THREE.BufferGeometry().setFromPoints([\n                new THREE.Vector3(0, 0, 0),\n                new THREE.Vector3(0, height, 0)\n            ]),\n            new THREE.LineBasicMaterial({ color: 0xffffff })\n        );\n        mesh.add(indicator);\n    }\n\n\n    private onClick(event: MouseEvent): void {\n        const rect = this.renderer.domElement.getBoundingClientRect();\n        this.mouse.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n        this.mouse.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;\n\n        this.raycaster.setFromCamera(this.mouse, this.camera);\n\n        const intersects = this.raycaster.intersectObjects(\n            this.meshes.filter(mesh => !mesh.userData.isPrimary)\n        );\n\n        if (intersects.length > 0) {\n            const selected = intersects[0].object as THREE.Mesh;\n            if (this.selectedPolygon !== selected) {\n                // Deselect previous\n                if (this.selectedPolygon) {\n                    this.resetObjectColor(this.selectedPolygon);\n                }\n                // Select new\n                this.selectedPolygon = selected;\n                this.highlightObject(selected);\n                console.log(`Selected building. Use U/D keys to adjust height. Current height: ${selected.userData.height}`);\n            }\n        } else if (this.selectedPolygon) {\n            this.resetObjectColor(this.selectedPolygon);\n            this.selectedPolygon = null;\n        }\n    }\n\n\n    private updatePolygonHeight(mesh: THREE.Mesh, newHeight: number, preventCameraReset = true): void {\n        const shape = mesh.userData.shape as THREE.Shape;\n        if (!shape) return;\n\n        // Clear previous height indicator if it exists\n        if (mesh.children.length > 0) {\n            mesh.remove(mesh.children[0]);\n        }\n\n        // Update height in service\n        if (mesh.userData.index !== undefined) {\n            this.mapStateService.updatePolygonHeight(mesh.userData.index, newHeight);\n        }\n\n        const heightKey = Math.round(newHeight * 10);\n\n        if (!mesh.userData.cachedGeometries) {\n            mesh.userData.cachedGeometries = {};\n        }\n\n        if (!mesh.userData.cachedGeometries[heightKey]) {\n            const geometry = new THREE.ExtrudeGeometry(shape, {\n                depth: newHeight,\n                bevelEnabled: false\n            });\n\n            // Apply transformations\n            geometry.rotateX(-Math.PI / 2);\n            geometry.rotateY(Math.PI);\n            geometry.scale(-1, 1, 1);\n            geometry.translate(0, 0, 0);\n\n            mesh.userData.cachedGeometries[heightKey] = geometry;\n        }\n\n        mesh.geometry.dispose();\n        mesh.geometry = mesh.userData.cachedGeometries[heightKey];\n        mesh.userData.height = newHeight;\n        mesh.position.y = 0;\n        this.createHeightIndicator(mesh);\n\n        if (!preventCameraReset) {\n            this.fitCameraToScene();\n        }\n\n        // Update history\n        if (mesh.userData.index !== undefined) {\n            this.heightHistory = this.heightHistory.slice(0, this.historyPointer + 1);\n            this.heightHistory.push({\n                index: mesh.userData.index,\n                height: newHeight\n            });\n            this.historyPointer++;\n        }\n\n        this.updateAllLabels();\n    }\n\n    public undoHeightChange(): void {\n        if (this.historyPointer >= 0) {\n            const entry = this.heightHistory[this.historyPointer];\n            const mesh = this.meshes.find(m => m.userData.index === entry.index);\n            if (mesh) {\n                const prevHeight = this.historyPointer > 0 ?\n                    this.heightHistory[this.historyPointer - 1].height :\n                    mesh.userData.originalHeight;\n\n                this.updatePolygonHeight(mesh, prevHeight);\n                this.historyPointer--;\n            }\n        }\n    }\n\n\n    // Cleanup Methods\n    private cleanup(): void {\n        cancelAnimationFrame(this.animationFrameId);\n        this.polygonSubscription?.unsubscribe();\n        window.removeEventListener('keydown', this.onKeyDown);\n        window.removeEventListener('keyup', this.onKeyUp);\n        window.removeEventListener('resize', this.onWindowResize);\n        this.clearMeshes();\n    }\n\n    // Rendering Methods\n    private addOSMTilesAndPolygons(polygons: {\n        coordinates: [number, number][];\n        height: number;\n        color: string | number;\n        opacity?: number;\n        isPrimary?: boolean;\n    }[]): void {\n        console.log('=== Loading OSM Tiles + Polygons ===');\n        // this.clearMeshes();\n        this.clearTilesOnly();\n\n        if (!polygons || polygons.length === 0) {\n            console.warn('No polygons to render');\n            return;\n        }\n\n        const scaleFactor = this.mapStateService.getResolution() ?? 1;\n        const [centerLon, centerLat] = this.mapStateService.center;\n        const [centerX, centerY] = fromLonLat([centerLon, centerLat], 'EPSG:3857');\n        console.log(`3D Origin: LonLat=[${centerLon}, ${centerLat}] -> Mercator=[${centerX}, ${centerY}], scaleFactor=${scaleFactor}`);\n\n        // Add debug marker for the origin\n        const originDebugMarker = new THREE.Mesh(\n            new THREE.SphereGeometry(2, 5, 5),\n            new THREE.MeshBasicMaterial({ color: 0xfff000 }) // Green for origin\n        );\n        originDebugMarker.position.set(0, 0.1, 0); // Origin in local coordinates\n        this.scene.add(originDebugMarker);\n        this.meshes.push(originDebugMarker);\n\n        console.log('Using tileSize:', this.tileSize);\n\n        this.loadOSMTiles(centerX, centerY, scaleFactor);\n\n        const processedPolygons = polygons.map(polygon => ({\n            coordinates: polygon.coordinates,\n            height: polygon.height,\n            color: polygon.color || '#5773a4',\n            opacity: polygon.opacity !== undefined ? polygon.opacity : (polygon.isPrimary ? 0.75 : 1),\n            isPrimary: polygon.isPrimary || false\n        }));\n\n        this.renderPolygons(processedPolygons, centerX, centerY, scaleFactor);\n    }\n\n    private clearTilesOnly(): void {\n        this.meshes = this.meshes.filter(mesh => {\n            const isPolygon = mesh.userData?.isPolygon;\n            if (!isPolygon) {\n                mesh.geometry?.dispose();\n                if (Array.isArray(mesh.material)) {\n                    mesh.material.forEach(m => m.dispose());\n                } else {\n                    mesh.material?.dispose();\n                }\n                this.scene.remove(mesh);\n                return false;\n            }\n            return true;\n        });\n    }\n\n    private getOptimalZoomLevel(): number {\n        const resolution = this.mapStateService.getResolution();\n        // Adjust zoom level based on resolution (meters per pixel)\n        if (resolution > 5) return 15;   // Low zoom (far away)\n        if (resolution > 1) return 17;   // Medium zoom\n        if (resolution > 0.5) return 18; // High zoom\n        return 19;                       // Very high zoom\n    }\n\n    private loadOSMTiles(originMercX: number, originMercY: number, scaleFactor: number): void {\n        const zoom = this.getOptimalZoomLevel();\n        const tileSize = 40075016.68557849 / Math.pow(2, zoom);\n\n        const tileX = Math.floor((originMercX + 20037508.342789244) / tileSize);\n        const tileY = Math.floor((20037508.342789244 - originMercY) / tileSize);\n\n        console.log(`Loading tiles at zoom=${zoom}, tileX=${tileX}, tileY=${tileY}, tileSize=${tileSize}`);\n\n        const loadTile = (tx: number, ty: number) => {\n            const tileLeft = tx * tileSize - 20037508.342789244;\n            const tileTop = 20037508.342789244 - ty * tileSize;\n\n            const retryLoad = (attempt = 1) => {\n                const textureLoader = new THREE.TextureLoader();\n                textureLoader.load(\n                    `https://a.tile.openstreetmap.org/${zoom}/${tx}/${ty}.png`,\n                    texture => {\n                        const planeSize = tileSize * scaleFactor;\n                        const plane = new THREE.Mesh(\n                            new THREE.PlaneGeometry(planeSize, planeSize),\n                            new THREE.MeshPhongMaterial({\n                                map: texture,\n                                transparent: true,\n                                opacity: 1\n                            })\n                        );\n\n                        plane.rotation.x = -Math.PI / 2;\n                        plane.position.set(\n                            (tileLeft - originMercX) * scaleFactor,\n                            0,\n                            -(tileTop - originMercY) * scaleFactor\n                        );\n\n                        // console.log(`Tile (${tx}, ${ty}) positioned at: x=${plane.position.x}, z=${plane.position.z}`);\n\n                        plane.receiveShadow = true;\n                        this.scene.add(plane);\n                        this.meshes.push(plane);\n                    },\n                    undefined,\n                    err => {\n                        console.error(`Error loading tile (${tx}, ${ty}):`, err);\n                        if (attempt < 3) {\n                            console.log(`Retrying tile (${tx}, ${ty}), attempt ${attempt + 1}`);\n                            setTimeout(() => retryLoad(attempt + 1), 500 * attempt);\n                        } else {\n                            console.warn(`Failed to load tile (${tx}, ${ty}) after ${attempt} attempts`);\n                            // Add a fallback tile or placeholder\n                            this.addFallbackTile(tx, ty, tileLeft, tileTop, originMercX, originMercY, scaleFactor);\n                        }\n                    }\n                );\n            };\n\n            retryLoad();\n        };\n\n        // Load 3x3 grid of tiles around the center\n        for (let dx = -1; dx <= 1; dx++) {\n            for (let dy = -1; dy <= 1; dy++) {\n                const tx = tileX + dx;\n                const ty = tileY + dy;\n                loadTile(tx, ty);\n            }\n        }\n    }\n\n    private addFallbackTile(tx: number, ty: number, tileLeft: number, tileTop: number,\n                            originMercX: number, originMercY: number, scaleFactor: number): void {\n        const planeSize = 40075016.68557849 / Math.pow(2, 19) * scaleFactor;\n        const plane = new THREE.Mesh(\n            new THREE.PlaneGeometry(planeSize, planeSize),\n            new THREE.MeshPhongMaterial({\n                color: 0xdddddd,\n                transparent: true,\n                opacity: 0.5\n            })\n        );\n\n        plane.rotation.x = -Math.PI / 2;\n        plane.position.set(\n            (tileLeft - originMercX) * scaleFactor,\n            0,\n            -(tileTop - originMercY) * scaleFactor\n        );\n\n        this.scene.add(plane);\n        this.meshes.push(plane);\n    }\n\n    private validateCoordinates(coords: [number, number][]): boolean {\n        return coords.every(coord =>\n            coord[0] >= -20037508.342789244 && coord[0] <= 20037508.342789244 &&\n            coord[1] >= -20037508.342789244 && coord[1] <= 20037508.342789244\n        );\n    }\n\n    private isCounterClockwise(coords: [number, number][]): boolean {\n        let sum = 0;\n        for (let i = 0; i < coords.length - 1; i++) {\n            const [x1, y1] = coords[i];\n            const [x2, y2] = coords[i + 1];\n            sum += (x2 - x1) * (y2 + y1);\n        }\n        return sum > 0;\n    }\n\n    private renderPolygons(\n        polygons: { coordinates: [number, number][]; height: number; color: string | number;\n            opacity: number; isPrimary: boolean }[],\n        originMercX: number,\n        originMercY: number,\n        scaleFactor: number\n    ): void {\n        this.clearMeshes();\n\n        polygons.forEach((polygonData, index) => {\n            if (!this.validateCoordinates(polygonData.coordinates)) {\n                console.warn(`Skipping invalid polygon ${index} with out-of-bounds coordinates`);\n                return;\n            }\n\n            if (!polygonData.coordinates || polygonData.coordinates.length < 3) {\n                console.warn(`Skipping invalid polygon ${index}`);\n                return;\n            }\n\n            let coords = polygonData.coordinates;\n            if (!this.isCounterClockwise(coords)) {\n                coords = [...coords].reverse();\n                console.log(`Reversed winding order for polygon ${index}`);\n            }\n\n            const shape = new THREE.Shape();\n            const height = polygonData.height;\n            let firstPoint: [number, number] | null = null;\n\n            // Create vertices array for debugging\n            // const vertices: THREE.Vector3[] = [];\n\n            coords.forEach(([x, y], i) => {\n                // Convert from Web Mercator to local coordinates\n                const localX = (x - originMercX) * scaleFactor - 76.2;\n                // Invert as Y is vertical axis in Three.js\n                const localZ = (originMercY - y) * scaleFactor - 76.2;\n\n                // vertices.push(new THREE.Vector3(localX, 0, localZ));\n\n                if (i === 0) {\n                    shape.moveTo(localX, localZ);\n                    firstPoint = [localX, localZ];\n                } else {\n                    shape.lineTo(localX, localZ);\n                }\n            });\n\n            if (firstPoint) shape.lineTo(firstPoint[0], firstPoint[1]);\n\n            try {\n                const geometry = new THREE.ExtrudeGeometry(shape, {\n                    depth: height,\n                    bevelEnabled: false,\n                    // control which faces are generated\n                    bevelThickness: 0,\n                    bevelSize: 0,\n                    bevelOffset: 0,\n                    bevelSegments: 0\n                });\n\n                // Rotate geometry to align with XZ plane (instead of rotating the mesh)\n                geometry.rotateX(-Math.PI / 2);\n\n                // Apply interim adjustments\n                // Rotation\n                geometry.rotateY(Math.PI); // 180 deg rotation - Negative for clockwise rotation\n\n                // Scaling\n                // geometry.scale(1, 1, 1);\n                geometry.scale(-1, 1, 1);  // Flip horizontally\n                //geometry.scale(1, -1, 1);  // Flip vertically\n                // geometry.scale(1, 1, -1);  // Flip depth-wise\n                // geometry.scale(-1, 1, -1);  // Flip both X and Z axes\n\n                // Translate geometry to correct position\n                geometry.translate(0, 0.01, 0);\n\n                /*\n                const material = new THREE.MeshPhongMaterial({\n                    color: polygonData.color || 0xffff00,\n                    // color: 0x90EE90,\n                    // wireframe: true,\n                    transparent: true,\n                    opacity: 0.8,\n                    side: THREE.DoubleSide\n                });\n                 */\n                let materials: THREE.Material[];\n\n                if (polygonData.isPrimary) {\n                    materials = [\n                        // Side material (visible)\n                        new THREE.MeshPhongMaterial({\n                            color: polygonData.color || 0xffffff,\n                            transparent: false,\n                            opacity: 0,\n                            side: THREE.FrontSide,\n                            // depthWrite: false,\n                            wireframe: true\n                        }),\n                        // Top/bottom material (completely transparent)\n                        new THREE.MeshPhongMaterial({\n                            transparent: false,\n                            opacity: 1,\n                            side: THREE.DoubleSide\n                        })\n                    ];\n                } else {\n                    // Secondary polygons - solid white with all faces\n                    materials = [\n                        // Side material (solid)\n                        new THREE.MeshPhongMaterial({\n                            color: 0xfff000,\n                            emissive: 0x333333,\n                            emissiveIntensity: 0.3,\n                            side: THREE.DoubleSide,\n                            transparent: false,\n                            opacity: 1\n                        }),\n                        // Top/bottom material (solid)\n                        new THREE.MeshPhongMaterial({\n                            color: 0xfff000,\n                            emissive: 0x333333,\n                            emissiveIntensity: 0.3,\n                            side: THREE.DoubleSide,\n                            transparent: false,\n                            opacity: 1,\n                        })\n                    ];\n                }\n\n                const mesh = new THREE.Mesh(geometry, materials);\n                mesh.position.y = 0; // on the ground\n                mesh.castShadow = !polygonData.isPrimary;\n                mesh.receiveShadow = true;\n\n                this.createHeightIndicator(mesh);\n\n                // store original data\n                mesh.userData = {\n                    ...mesh.userData,\n                    isPolygon: true,\n                    shape: shape,\n                    height: polygonData.height,\n                    color: polygonData.color,\n                    index: index,\n                    isPrimary: polygonData.isPrimary\n                };\n\n                this.scene.add(mesh);\n                this.meshes.push(mesh);\n\n                // Add debug markers for vertices\n                /*\n                vertices.forEach(vertex => {\n                    const marker = new THREE.Mesh(\n                        new THREE.SphereGeometry(2, 6, 6),\n                        new THREE.MeshBasicMaterial({ color: 0xff0000 })\n                    );\n                    marker.position.copy(vertex);\n                    this.scene.add(marker);\n                    this.meshes.push(marker);\n                });\n                 */\n\n            } catch (error) {\n                console.error(`Failed to create polygon ${index}:`, error);\n            }\n        });\n\n        this.fitCameraToScene();\n        this.updateAllLabels();\n    }\n\n    private clearMeshes(): void {\n        this.meshes.forEach(mesh => {\n            mesh.geometry?.dispose();\n            if (Array.isArray(mesh.material)) {\n                mesh.material.forEach(m => m.dispose());\n            } else {\n                mesh.material?.dispose();\n            }\n            this.scene.remove(mesh);\n        });\n        this.meshes = [];\n\n        // Also clear grid, if present\n\n    }\n\n    // Camera Methods\n    private fitCameraToScene(preserveDistance = false): void {\n        if (!this.meshes.length) return;\n\n        const box = new THREE.Box3();\n        this.meshes.forEach(mesh => box.expandByObject(mesh));\n\n        const center = new THREE.Vector3();\n        box.getCenter(center);\n\n        if (preserveDistance) {\n            // Only update the target, not the position\n            this.controls.target.copy(center);\n        } else {\n            // Original fitting logic\n            const size = new THREE.Vector3();\n            box.getSize(size);\n            const maxDim = Math.max(size.x, size.z);\n            const fovRad = this.camera.fov * (Math.PI / 180);\n            let distance = maxDim / (2 * Math.tan(fovRad / 2)) * 1.5;\n\n            this.camera.position.set(\n                center.x + distance * 0.7,\n                distance * 0.7,\n                center.z + distance * 0.7\n            );\n            this.controls.target.copy(center);\n        }\n        this.controls.update();\n    }\n\n    private debugAlignmentOffset(): void {\n        let tileBox = new THREE.Box3();\n\n        this.meshes.forEach((mesh, i) => {\n            console.log(`Mesh ${i} position:`, mesh.position);\n\n            // Create a new bounding box for this mesh\n            mesh.geometry.computeBoundingBox();\n            const meshBox = mesh.geometry.boundingBox?.clone();\n\n            if (!meshBox) {\n                console.warn(`Mesh ${i} has no valid bounding box`);\n                return;\n            }\n\n            // Apply the mesh's world matrix to the bounding box\n            meshBox.applyMatrix4(mesh.matrixWorld);\n            tileBox.union(meshBox);\n        });\n\n        if (tileBox.isEmpty()) {\n            console.warn('Tile bounding box is empty');\n            return;\n        }\n\n        const tileCenter = new THREE.Vector3();\n        tileBox.getCenter(tileCenter);\n        console.log(`Tile bounding box center: X=${tileCenter.x.toFixed(2)}, Z=${tileCenter.z.toFixed(2)}`);\n    }\n\n    // Event Handlers\n    private onKeyDown(event: KeyboardEvent): void {\n        const key = event.key.toLowerCase();\n        this.keysPressed[key] = true;\n\n        // Handle height adjustment when a polygon is selected\n        if (this.selectedPolygon) {\n            const heightStep = event.shiftKey ? 0.4 : 2.4; // Fine control with Shift\n\n            if (key === 'u') { // U for Up\n                event.preventDefault();\n                const newHeight = Math.min(\n                    this.maxHeight,\n                    this.selectedPolygon.userData.height + heightStep\n                );\n                this.updatePolygonHeight(this.selectedPolygon, newHeight, true);\n            }\n            else if (key === 'd') { // D for Down\n                event.preventDefault();\n                const newHeight = Math.max(\n                    this.minHeight,\n                    this.selectedPolygon.userData.height - heightStep\n                );\n                this.updatePolygonHeight(this.selectedPolygon, newHeight, true);\n            }\n            else if (key === 's') { // S for snapping toggle\n                this.toggleSnapping();\n            }\n        }\n        // Keep existing orbit controls keys\n        else {\n            if (key === 's') {\n                this.toggleSnapping();\n            }\n        }\n    }\n\n    private onKeyUp(event: KeyboardEvent): void {\n        this.keysPressed[event.key.toLowerCase()] = false;\n    }\n\n\n    private onWindowResize(): void {\n        const width = this.rendererContainer.nativeElement.clientWidth;\n        const height = this.rendererContainer.nativeElement.clientHeight;\n\n        this.camera.aspect = width / height;\n        this.camera.updateProjectionMatrix();\n        this.renderer.setSize(width, height);\n    }\n\n    // Animation and Controls\n    private handleKeyboardControls(delta: number): void {\n        if (!this.enableKeyboardControls) return;\n        if (this.keysPressed['ctrl'] || this.keysPressed['alt'] || this.keysPressed['meta']) return;\n\n        const move = this.moveSpeed * delta;\n        const forward = new THREE.Vector3();\n        this.camera.getWorldDirection(forward);\n        forward.y = 0;\n        forward.normalize();\n\n        const right = new THREE.Vector3().crossVectors(forward, new THREE.Vector3(0, 1, 0)).normalize();\n\n        if (this.keysPressed['w'] || this.keysPressed['arrowup']) {\n            this.camera.position.add(forward.clone().multiplyScalar(move));\n            this.controls.target.add(forward.clone().multiplyScalar(move));\n        }\n        if (this.keysPressed['s'] || this.keysPressed['arrowdown']) {\n            this.camera.position.add(forward.clone().multiplyScalar(-move));\n            this.controls.target.add(forward.clone().multiplyScalar(-move));\n        }\n        if (this.keysPressed['a'] || this.keysPressed['arrowleft']) {\n            this.camera.position.add(right.clone().multiplyScalar(-move));\n            this.controls.target.add(right.clone().multiplyScalar(-move));\n        }\n        if (this.keysPressed['d'] || this.keysPressed['arrowright']) {\n            this.camera.position.add(right.clone().multiplyScalar(move));\n            this.controls.target.add(right.clone().multiplyScalar(move));\n        }\n        if (this.keysPressed['q']) {\n            this.camera.position.y += move;\n            this.controls.target.y += move;\n        }\n        if (this.keysPressed['e']) {\n            this.camera.position.y -= move;\n            this.controls.target.y -= move;\n        }\n    }\n\n    private animate(time: number): void {\n        this.animationFrameId = requestAnimationFrame(t => this.animate(t));\n        const delta = (time - this.lastTime) / 1000;\n        this.lastTime = time;\n\n        this.handleKeyboardControls(delta);\n        this.controls.update();\n\n        this.renderer.render(this.scene, this.camera);\n    }\n}\n","<div #rendererContainer class=\"three-container\"></div>\n<div id=\"debugOverlay\" style=\"\n    position: fixed;\n    top: 10px;\n    left: 10px;\n    background: rgba(0,0,0,0.7);\n    color: #0f0;\n    padding: 5px;\n    font: 12px monospace;\n    z-index: 9999;\n\"></div>\n<div id=\"sunControl\" style=\"\n    position: fixed;\n    bottom: 20px;\n    left: 50%;\n    transform: translateX(-50%);\n    background: rgba(0,0,0,0.7);\n    color: white;\n    padding: 10px;\n    border-radius: 5px;\n    z-index: 1000;\n\">\n    <div>Sun Position</div>\n    <div>\n        <label>Azimuth: </label>\n        <input type=\"range\" min=\"0\" max=\"360\" [(ngModel)]=\"sunPosition.azimuth\"\n               (input)=\"updateSunPosition()\">\n        {{sunPosition.azimuth}}°\n    </div>\n    <div>\n        <label>Elevation: </label>\n        <input type=\"range\" min=\"0\" max=\"90\" [(ngModel)]=\"sunPosition.elevation\"\n               (input)=\"updateSunPosition()\">\n        {{sunPosition.elevation}}°\n    </div>\n</div>\n","import {AfterViewInit, ChangeDetectorRef, Component, Input, OnDestroy, OnInit, ViewChild} from '@angular/core';\nimport {MessageService} from 'primeng/api';\nimport {\n  AcabimSite,\n  GeoAreaPipe,\n  GeoPolygonPipe,\n  LandApiService,\n  MapComponent,\n  MapConfig,\n  SiteApiService\n} from '@cas-hub/acabim-common-client';\nimport {Store} from '@ngrx/store';\nimport {Observable, Subscription} from 'rxjs';\nimport * as SubdivisionActions from '../../../_store/subdivision/subdivision.actions';\nimport {MapStateService} from '../../../_services/three-content.service';\n\n@Component({\n    selector: 'acaland-site-subdivision-map',\n    templateUrl: './site-subdivision-map.component.html',\n    styleUrls: ['./site-subdivision-map.component.scss'],\n    providers: [MessageService]\n})\nexport class SiteSubdivisionMapComponent implements OnInit, OnDestroy, AfterViewInit {\n    @Input() site: AcabimSite = {\n      address: '',\n      area: 0,\n      coordinates: [],\n      createdDate: '',\n      groups: [],\n      id: '',\n      isLocationEditable: true,\n      lastModifiedDate: '',\n      latitude: 0,\n      longitude: 0,\n      name: '',\n      perimeter: 0,\n      projects: [],\n      region: {\n        postcode: '',\n        region_key: '',\n        region_name: ''\n      },\n      status: ''\n    };\n    areas: number[][] = [];\n    coords?: number[][][];\n    coordsPopped?: number[][];\n    defaultZoom = 20;\n    nearby: number[][][] = [];\n    primaryArea: number[] = [];\n    flatCoords?: number[][];\n    private calculationData$: Observable<any> = new Observable<any>();\n    private calculationDataSub: Subscription = new Subscription();\n    is3DView = false;\n\n\n    @ViewChild('map') map?: MapComponent;\n\n    @Input() mapConfig?: MapConfig;\n\n    constructor(\n        private messageService: MessageService,\n        private readonly cd: ChangeDetectorRef,\n        private readonly geoPolygonPipe: GeoPolygonPipe,\n        private readonly landService: LandApiService,\n        private readonly geoAreaPipe: GeoAreaPipe,\n        private store: Store<any>,\n        private siteApiService: SiteApiService,\n        private mapStateService: MapStateService\n    ) {}\n\n    ngOnInit(): void {\n        this.siteApiService.selectedSiteId = this.site.id;\n    }\n\n    ngAfterViewInit(): void {\n        this.calculationData$ = this.store.select('subdivision');\n        this.calculationDataSub = this.calculationData$.subscribe(async d => {\n            if (this.map) {\n                if (d.sectionCoordinates && d.sectionCoordinates !== this.coords) {\n                    this.coords = d.sectionCoordinates;\n                    if (this.coords && this.coords[0]) {\n                        this.coordsPopped = this.coords[0];\n                    }\n                    this.landService.getNearbySites({latitude: this.site?.latitude ?? 0, longitude: this.site?.longitude ?? 0}).subscribe(near => {\n                        this.nearby = this.geoPolygonPipe.transform(near);\n                        this.mapStateService.setSecondaryPolygons(this.nearby);\n                    });\n                    this.flatCoords = this.coords ? this.coords[0] : [];\n                    this.cd.detectChanges();\n                    // if (this.coords && this.coords.length > 0) {\n                    //     await this.map.refreshMultiplePolyline().then(res => {});\n                    // } else {\n                    //     await this.map.setToDefaultMap();\n                    // }\n                } else if (d.sectionCoordinates && d.sectionCoordinates.length === 0) {\n                   await this.map.handleRefresh();\n                }\n            }\n        });\n    }\n\n    ngOnDestroy(): void {\n        this.calculationDataSub.unsubscribe();\n    }\n\n    selectAddress(event: any) {\n        console.dir(event);\n    }\n\n    handleChanges(value: any) {\n        this.areas = [];\n        // The primary site is always the first polygon in the array\n        value.map((geometry: {type: string, coordinates: number[][][]}) => {\n            console.dir(typeof geometry);\n            const area1 = this.geoAreaPipe.transform(geometry.coordinates);\n            this.areas.push(area1);\n        });\n\n        this.primaryArea = this.geoAreaPipe.transform(value[0].coordinates);\n        const coordinates: [][] = value[0].coordinates[0];\n        const area: number = this.primaryArea[0];\n        this.mapStateService.setPrimaryPolygon(coordinates);\n        this.store.dispatch(SubdivisionActions.onSectionCoordinates({coordinates, area}));\n    }\n\n    setToast(num: number): void {\n            this.messageService.clear();\n            this.messageService.add({\n                sticky: true,\n                severity: 'success',\n                summary: '',\n                detail: ''\n            });\n    }\n    show3DMap = false;\n\n    toggleMap(): void {\n        this.show3DMap = !this.show3DMap;\n    }\n\n} // EOC\n","<div id=\"map-wrapper\">\n  <!-- Top Info Space -->\n  <div class=\"topInfoSpace\" *ngIf=\"!show3DMap\">\n    <p>\n      <span>Keyboard control: </span>\n          <span><b>P</b>:polygon</span>\n          <span><b>M</b>:measure</span>\n      <span><b>D</b>:delete</span>\n    </p>\n  </div>\n  <button (click)=\"toggleMap()\" style=\"float: right;font-size:0.8rem;top:0;right:0;\">{{ show3DMap ? '2D' : '3D' }} Map</button>\n  <acaland-map\n    #map\n    [focus]=\"mapConfig\"\n      [showSite]=\"true\"\n      [siteDetails]=\"site\"\n      [secondaryPolygons]=\"nearby\"\n      [canDraw]=\"true\"\n      (primaryChanges)=\"handleChanges($event)\">\n  </acaland-map>\n  <!-- Three.js 3D Map -->\n  <app-map3d *ngIf=\"show3DMap\" [enableKeyboardControls]=\"true\"></app-map3d>\n</div>\n","import {Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {\n    GenericPayloadModel,\n    GenericPayloadType,\n    ProjectApiService,\n    ReportService,\n    SiteApiService,\n    SubDivisionCalculation,\n    SubdivisionCalculationService\n} from '@cas-hub/acabim-common-client';\nimport {MessageService} from 'primeng/api';\nimport {Subscription} from 'rxjs';\n\n@Component({\n    selector: 'acaland-subdivision-calculation-result',\n    templateUrl: './subdivision-calculation-result.component.html',\n    styleUrls: ['./subdivision-calculation-result.component.scss']\n})\nexport class SubdivisionCalculationResultComponent implements OnInit, OnDestroy {\n    private parentValues: any;\n    private subdivisionSub: Subscription = new Subscription();\n    public cashOnlyData: GenericPayloadModel[] = [];\n    public secondTierData: GenericPayloadModel[] = [];\n    showAddProjectModal = false;\n    dataPayload: SubDivisionCalculation | null = null;\n    @Input()\n    public set dataStore(value: SubDivisionCalculation | null) {\n        if (value) {\n            this.dataPayload = value;\n        }\n    }\n    @Input() siteId: string | null = null;\n    @Input() projectId: string | null = null;\n    updateClass = 'cas-button-action';\n\n    @Input()\n    public set param(value: any) {\n        this.parentValues = value;\n        if (value) {\n            this.month = value.expectedMonth;\n\n            this.cashNeeded = Math.floor(value.cashOnlyPlayer);\n            this.profit = Math.floor(value.totalInHand - value.rcDocContribution - value.totalBCLand);\n            this.profitAfterCompanyTax = Math.floor(this.profit * 0.67);\n            this.roi = Math.round(this.profitAfterCompanyTax / value.cashOnlyPlayer * 100 * 100) / 100;\n            this.annualised = Math.round(((Math.pow((1 + (this.roi / 100)), ((12 / value.expectedMonth)))) - 1) * 100 * 100) / 100;\n\n            this.secondTierCash = Math.round(value.secondTierInvestor);\n            this.secondTierProfit = Math.round(value.totalInHand - value.secondTierInterest - value.rcDocContribution - value.totalBCLand);\n            this.secondTierProfitAfterTax = Math.round(this.secondTierProfit * 0.67);\n            this.secondTierROI = Math.round(this.secondTierProfitAfterTax / value.secondTierInvestor * 100 * 100) / 100;\n            this.secondTierAnnualised = Math.round(((Math.pow((1 + (this.secondTierROI / 100)), ((12 / value.expectedMonth)))) - 1) * 100 * 100) / 100;\n        }\n    }\n\n    @Input() public siteZone?: { key: string, value: string };\n\n    constructor(\n        private calculationService: SubdivisionCalculationService,\n        private readonly messageService: MessageService,\n        private readonly projectApiService: ProjectApiService,\n        private readonly reportApiService: ReportService,\n        private readonly siteApiService: SiteApiService,\n        private readonly subdivisionCalculationService: SubdivisionCalculationService\n    ) {}\n\n    month?: number;\n    cashNeeded?: number;\n    profit?: number;\n    profitAfterCompanyTax?: number;\n    roi?: number;\n    annualised?: number;\n\n    secondTierCash?: number;\n    secondTierProfit?: number;\n    secondTierProfitAfterTax?: number;\n    secondTierROI?: number;\n    secondTierAnnualised?: number;\n\n    public pendingReport = false;\n\n    ngOnInit(): void {\n        this.setCashOnlyData();\n        this.setSecondTierData();\n        if (this.projectId !== null) {\n            this.updateClass = 'cas-button';\n        } else {\n            this.updateClass = 'cas-button-action';\n        }\n        this.showAddProjectModal = false;\n        // console.log(this.siteId);\n    }\n\n    ngOnDestroy(): void {\n        this.subdivisionSub.unsubscribe();\n    }\n\n    public newProject(): void {\n        this.showAddProjectModal = true;\n    }\n\n    public onNewProjectCreated(projectName: string) {\n        this.showAddProjectModal = false;\n    }\n\n    public updateProject(): void {\n        this.setCalcData();\n        this.messageService.clear();\n        this.messageService.add({\n            severity: 'success',\n            summary: 'Successfully updated your project',\n            detail: 'Your calculations have been saved to the current project.'\n        });\n    }\n\n    setCalcData(): void {\n        if (this.siteId !== null && this.projectId !== null) {\n            console.dir(this.dataPayload);\n            this.subdivisionSub = this.calculationService.setData(this.dataPayload, this.siteId, this.projectId).subscribe(\n                result => {\n                    console.dir(result);\n                }\n            );\n        }\n\n    }\n    public getSiteDevelopmentFeasibilityReport(): void {\n        this.parentValues.month = this.month;\n        this.parentValues.agentFee = this.parentValues.agentFee.value;\n        this.parentValues.cashNeeded = this.cashNeeded;\n        this.parentValues.profit = this.profit;\n        this.parentValues.profitAfterCompanyTax = this.profitAfterCompanyTax;\n        this.parentValues.roi = this.roi;\n        this.parentValues.annualised = this.annualised;\n        this.parentValues.secondTierCash = this.secondTierCash;\n        this.parentValues.secondTierProfit = this.secondTierProfit;\n        this.parentValues.secondTierProfitAfterTax = this.secondTierProfitAfterTax;\n        this.parentValues.secondTierROI = this.secondTierROI;\n        this.parentValues.secondTierAnnualised = this.secondTierAnnualised;\n        this.parentValues.projectId = this.projectApiService.selectedProjectId;\n        this.parentValues.planningZone = this.siteZone?.value;\n        this.parentValues.siteGuid = this.siteApiService.selectedSiteId;\n        this.setCashOnlyData();\n\n        if (this.projectApiService.selectedProjectId && this.siteZone) {\n            this.pendingReport = true;\n            // need to pass this.siteApiService.selectedSite?.id to the report\n            this.reportApiService.getReport('SiteDevelopmentFeasibilityReport', this.parentValues)\n                .subscribe(blob => ReportService.savePdfFile(blob, `SiteDevelopmentFeasibilityReport_${this.projectApiService.selectedProject?.name}`), error => {\n                    this.pendingReport = false;\n                    console.error(error);\n                }, () => {\n                    this.pendingReport = false;\n                });\n        } else {\n            this.messageService.clear();\n            this.messageService.add({\n                severity: 'error',\n                summary: 'Please select project and zone to generate report',\n                sticky: true\n            });\n        }\n    }\n\n    setCashOnlyData(): void {\n        this.cashOnlyData = [];\n        this.cashOnlyData.push({\n            value: this.cashNeeded,\n            label: 'Cash needed (ex GST)',\n            type: GenericPayloadType.currency,\n            key: 'cashNeeded'\n        });\n        this.cashOnlyData.push({\n            value: this.profit,\n            label: 'Profit (ex GST)',\n            type: GenericPayloadType.currency,\n            key: 'profit'\n        });\n        this.cashOnlyData.push({\n            value: this.profitAfterCompanyTax,\n            label: 'Profit (after 33% company tax)',\n            type: GenericPayloadType.currency,\n            key: 'profitAfterCompanyTax'\n        });\n        this.cashOnlyData.push({\n            value: this.roi,\n            label: '% ROI after tax',\n            type: GenericPayloadType.percentage,\n            key: 'roi'\n        });\n        this.cashOnlyData.push({\n            value: this.annualised,\n            // tslint:disable-next-line:no-bitwise\n            label: 'Annualised over ' + (typeof this.month !== 'undefined' ? ~~this.month : 0) + ' months',\n            type: GenericPayloadType.percentage,\n            key: 'annualised'\n        });\n    }\n\n    setSecondTierData(): void {\n        this.secondTierData = [];\n        this.secondTierData.push({\n            value: this.secondTierCash,\n            label: 'Cash needed (ex GST)',\n            type: GenericPayloadType.currency,\n            key: 'secondTierCash'\n        });\n        this.secondTierData.push({\n            value: this.secondTierProfit,\n            label: 'Profit (ex GST)',\n            type: GenericPayloadType.currency,\n            key: 'secondTierProfit'\n        });\n        this.secondTierData.push({\n            value: this.secondTierProfitAfterTax,\n            label: 'Profit (after 33% company tax)',\n            type: GenericPayloadType.currency,\n            key: 'secondTierProfitAfterTax'\n        });\n        this.secondTierData.push({\n            value: this.secondTierROI,\n            label: '% ROI after tax',\n            type: GenericPayloadType.percentage,\n            key: 'secondTierROI'\n        });\n        this.secondTierData.push({\n            value: this.secondTierAnnualised ?? 0,\n            // tslint:disable-next-line:no-bitwise\n            label: 'Annualised over ' + (typeof this.month !== 'undefined' ? ~~this.month : 0) + ' months',\n            type: GenericPayloadType.percentage,\n            key: 'secondTierAnnualised'\n        });\n    }\n\n    showResetConfirm() {\n        this.messageService.clear();\n        this.messageService.add({key: 'resetPrompt', sticky: true, severity: 'warn', summary: 'Are you sure?', detail: 'Current data will be reset and stored data removed.'});\n    }\n\n    resetForm() {\n        const siteId = this.siteId;\n        const projectId = this.projectId;\n        if (siteId !== null && projectId !== null){\n            this.subdivisionCalculationService.deleteData(siteId, projectId).subscribe(response => {\n                this.messageService.clear('resetPrompt');\n                window.location.reload();\n            });\n        }\n    }\n\n    onRejectReset() {\n        this.messageService.clear('resetPrompt');\n    }\n}\n","<div>\n    <div class=\"cas-prompt-toast\">\n        <p-toast position=\"center\" key=\"resetPrompt\" (onClose)=\"onRejectReset()\" [baseZIndex]=\"5000\">\n            <ng-template let-message pTemplate=\"message\">\n                <div class=\"p-flex p-flex-column\" style=\"flex: 1\">\n                    <div class=\"p-text-center\">\n                        <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem\"></i>\n                        <h4>{{message.summary}}</h4>\n                        <p>{{message.detail}}</p>\n                    </div>\n                    <div class=\"cas-action-buttons flex-evenly\">\n                        <button type=\"button\" (click)=\"resetForm()\" class=\"cas-button-action\">Yes</button>\n                        <button type=\"button\" (click)=\"onRejectReset()\">No</button>\n                    </div>\n                </div>\n            </ng-template>\n        </p-toast>\n    </div>\n    <div class=\"cas-flex-row\">\n        <div class=\"p-col-6\">\n            <acabim-card [cardContent]=\"cashOnly\" cardHeading=\"Cash Only Investor\"></acabim-card>\n        </div>\n        <div class=\"p-col-6\">\n            <acabim-card [cardContent]=\"secondTier\" cardHeading=\"2nd Tier Investor\"></acabim-card>\n        </div>\n        <div class=\"cas-action-buttons cas-action-buttons-bottom\" *ngIf=\"!pendingReport; else loadingView\">\n            <button (click)=\"showResetConfirm()\">Reset</button>\n            <button *ngIf=\"projectId\" (click)=\"updateProject()\">Update existing Project</button>\n            <button class=\"{{updateClass}}\" (click)=\"newProject()\">Save as new Project</button>\n            <button class=\"cas-button-action cas-button-right\" (click)=\"getSiteDevelopmentFeasibilityReport()\">Report</button>\n        </div>\n    </div>\n</div>\n\n<ng-template #cashOnly>\n    <acabim-data-display [dataMap]=\"cashOnlyData\" labelWidth=\"15rem\"></acabim-data-display>\n</ng-template>\n\n<ng-template #secondTier>\n    <acabim-data-display [dataMap]=\"secondTierData\" labelWidth=\"15rem\"></acabim-data-display>\n</ng-template>\n\n<p-toast position=\"center\"></p-toast>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n\n<ng-template [ngIf]=\"showAddProjectModal\">\n    <acabim-modal\n        width=\"80vw\"\n        fixHeight=\"80vh\"\n        [display]=\"true\"\n        [title]=\"'Add a new project'\">\n        <acaland-add-project [siteId]=\"siteId\" [dataStore]=\"dataPayload\" (projectCreated)=\"onNewProjectCreated($event)\"></acaland-add-project>\n    </acabim-modal>\n</ng-template>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {GenericPayloadModel, GenericPayloadType, SubDivisionCalculationOutput} from '@cas-hub/acabim-common-client';\n\n@Component({\n    selector: 'acaland-subdivision-calculation-analysis',\n    templateUrl: './subdivision-calculation-analysis.component.html',\n    styleUrls: ['../subdivision-calculation-detail.component.scss', './subdivision-calculation-analysis.component.scss']\n})\nexport class SubdivisionCalculationAnalysisComponent implements OnInit {\n\n    public saleData: GenericPayloadModel[] = [];\n    public subdivisionFeeData: GenericPayloadModel[] = [];\n    public RCConstructionData: GenericPayloadModel[] = [];\n\n    @Input() public params: SubDivisionCalculationOutput | null = null;\n\n    ngOnInit(): void {\n        this. setSaleData();\n        this.setSubdivisionFeeData();\n        this.setRCConstructionData();\n    }\n\n    setSaleData(): void {\n        if (this.params !== null) {\n            this.saleData = [];\n            this.saleData.push({\n                value: this.params.expectedSalePrice,\n                label: 'Expected sale price',\n                type: GenericPayloadType.currency,\n                key: 'expectedSalePrice'\n            });\n            this.saleData.push({\n                value: this.params.realEstateAgentFee,\n                label: 'Less real estate agent fee',\n                type: GenericPayloadType.currency,\n                key: 'realEstateAgentFee'\n            });\n            this.saleData.push({\n                value: this.params.totalInHand,\n                label: 'Total in hand after sale',\n                type: GenericPayloadType.currency,\n                key: 'totalInHand'\n            });\n        }\n    }\n\n    setSubdivisionFeeData(): void {\n        if (this.params !== null) {\n            this.subdivisionFeeData = [];\n            this.subdivisionFeeData.push({\n                value: this.params.subdivisionFeeCalculated,\n                label: 'Total subdivision fee',\n                type: GenericPayloadType.currency,\n                key: 'subdivisionFeeCalculated'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'RC feasibility design',\n                type: GenericPayloadType.text,\n                key: 'RCFeasibilityDesign'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'CCTV survey',\n                type: GenericPayloadType.text,\n                key: 'CCTVSurvey'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Topographical survey',\n                type: GenericPayloadType.text,\n                key: 'TopographicalSurvey'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'RC concept design',\n                type: GenericPayloadType.text,\n                key: 'RCConceptDesign'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Planning',\n                type: GenericPayloadType.text,\n                key: 'Planning'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'RC application fee',\n                type: GenericPayloadType.text,\n                key: 'RCApplicationFee'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Civil engineering',\n                type: GenericPayloadType.text,\n                key: 'CivilEngineering'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Geotechnical engineering',\n                type: GenericPayloadType.text,\n                key: 'GeotechnicalEngineering'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Traffic engineering',\n                type: GenericPayloadType.text,\n                key: 'TrafficEngineering'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Council contribution',\n                type: GenericPayloadType.text,\n                key: 'CouncilContribution'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Title application',\n                type: GenericPayloadType.text,\n                key: 'TitleApplication'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'BC architectural',\n                type: GenericPayloadType.text,\n                key: 'BCArchitectural'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'BC structural engineering',\n                type: GenericPayloadType.text,\n                key: 'BCStructuralEngineering'\n            });\n            this.subdivisionFeeData.push({\n                value: '',\n                label: 'Legal',\n                type: GenericPayloadType.text,\n                key: 'Legal'\n            });\n        }\n    }\n\n    setRCConstructionData(): void {\n        if (this.params !== null) {\n            this.RCConstructionData = [];\n            this.RCConstructionData.push({\n                value: this.params.RCConstructionCalculated,\n                label: 'RC Construction Costs',\n                type: GenericPayloadType.currency,\n                key: 'RCConstructionCalculated'\n            });\n            this.RCConstructionData.push({\n                value: this.params.bcConstruction,\n                label: 'BC Construction Costs',\n                type: GenericPayloadType.currency,\n                key: 'bcConstruction'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Public drainlayer',\n                type: GenericPayloadType.text,\n                key: 'PublicDrainlayer'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Driveway',\n                type: GenericPayloadType.text,\n                key: 'Driveway'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Boundary retaining wall',\n                type: GenericPayloadType.text,\n                key: 'BoundaryRetainingWall'\n            });\n            this.RCConstructionData.push({\n                value: this.params.RCLandscape,\n                label: 'RC landscaping',\n                type: GenericPayloadType.currency,\n                key: 'RCLandscape'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Water meter',\n                type: GenericPayloadType.text,\n                key: 'WaterMeter'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Power meter',\n                type: GenericPayloadType.text,\n                key: 'PowerMeter'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'Gas meter',\n                type: GenericPayloadType.text,\n                key: 'GasMeter'\n            });\n            this.RCConstructionData.push({\n                value: '',\n                label: 'All in one',\n                type: GenericPayloadType.text,\n                key: 'AllInOne'\n            });\n        }\n    }\n}\n","<form class=\"w-100 h-100\">\n    <div class=\"cas-flex-row\">\n        <div class=\"p-col-6\">\n            <acabim-card [cardContent]=\"subdivisionFee\" cardHeading=\"Subdivision Fees (+GST)\"></acabim-card>\n        </div>\n        <div class=\"p-col-6\">\n            <acabim-card [cardContent]=\"sale\" cardHeading=\"Sale (+GST)\"></acabim-card>\n            <acabim-card [cardContent]=\"RCConstruction\" cardHeading=\"Planning & Construction Costs (+GST)\"></acabim-card>\n        </div>\n    </div>\n</form>\n\n<ng-template #sale>\n    <acabim-data-display [dataMap]=\"saleData\" labelWidth=\"15rem\"></acabim-data-display>\n</ng-template>\n\n<ng-template #subdivisionFee>\n    <acabim-data-display [dataMap]=\"subdivisionFeeData\" labelWidth=\"15rem\"></acabim-data-display>\n</ng-template>\n\n<ng-template #RCConstruction>\n    <acabim-data-display [dataMap]=\"RCConstructionData\" labelWidth=\"15rem\"></acabim-data-display>\n</ng-template>\n","import {Component, Input, OnInit} from '@angular/core';\nimport {MessageService} from 'primeng/api';\nimport {\n    SubDivisionCalculation,\n    SubDivisionCalculationInput,\n    SubDivisionCalculationOutput,\n} from '@cas-hub/acabim-common-client';\nimport {Observable, Subscription} from 'rxjs';\nimport {SubdivisionCalculationModel} from '../../../../_models/subdivision-calculation.model';\nimport {Store} from '@ngrx/store';\nimport {SubDivisionCalculationZone} from '@cas-hub/acabim-common-client';\n\n@Component({\n    selector: 'acaland-subdivision-calculation-detail',\n    templateUrl: './subdivision-calculation-detail.component.html',\n    styleUrls: ['./subdivision-calculation-detail.component.scss']\n})\nexport class SubdivisionCalculationDetailComponent implements OnInit {\n\n    RCConstructionCalculated?: number;\n    RCLandscape?: number;\n    bcConstruction?: number;\n    calculationData$: Observable<any> = new Observable<any>();\n    calculations: SubdivisionCalculationModel | null = null;\n    dataIn: SubDivisionCalculationInput | null = null;\n    dataOut: SubDivisionCalculationOutput | null = null;\n    dataStore: SubDivisionCalculation | null = null;\n    expectedSalePrice?: number;\n    params: any = {};\n    realEstateAgentFee?: number;\n    siteZone: SubDivisionCalculationZone = {key: '', value: ''};\n    subCalculationData: Subscription = new Subscription();\n    subdivisionFeeCalculated?: number;\n    totalInHand?: number;\n\n    @Input() siteId: string | null = null;\n    @Input() projectId: string | null = null;\n\n\n    constructor(\n        private store: Store<any>,\n        private messageService: MessageService\n    ) {\n        this.calculationData$ = this.store.select('subdivision');\n        this.subCalculationData = this.calculationData$.subscribe(d => {\n            this.calculations = d;\n            this.handleData();\n        });\n    }\n\n    ngOnInit(): void {\n        this.messageService.clear();\n        this.messageService.add({key: 'subdivisionCalculationDetails', severity: 'success', summary: 'Service Message', detail: 'Via MessageService'});\n        this.messageService.add({\n            key: 'subdivisionCalculationDetails',\n            severity: 'warn',\n            summary: 'Data for multiple sites cannot be stored'\n        });\n    }\n\n    // setCalcData(): void {\n    //     if (this.calculations?.selectedSiteObjects?.length === 1) {\n    //         const firstSite = this.calculations?.selectedSiteObjects.pop();\n    //         if (firstSite) {\n    //             this.subdivisionSub = this.calculationService.setData(this.dataStore, firstSite.core?.id, '').subscribe(\n    //                 result => {\n    //                     console.dir(result);\n    //                 }\n    //             );\n    //         }\n    //     }\n    // }\n\n    processOutputs(): void {\n        if (this.params !== null) {\n            this.dataOut = {\n                agentFee: this.params.agentFee ?? {name: '', value: 0},\n                averageFloorArea: Number(this.params.averageFloorArea) ?? 0,\n                bcConstruction: Number(this.params.bcConstruction ?? 0),\n                buildingCoverageArea: Number(this.params.buildingCoverageArea ?? 0),\n                cashOnlyPlayer: Number(this.params.cashOnlyPlayer ?? 0),\n                constructionCost: Number(this.params.constructionCost ?? 0),\n                professionalFee: Number(this.params.professionalFee ?? 0),\n                expectedMonth: Number(this.params.expectedMonth ?? 0),\n                expectedSalePrice: Number(this.params.expectedSalePrice ?? 0),\n                landscapedArea: Number(this.params.landscapedArea ?? 0),\n                numberOfStoreys: Number(this.params.numberOfStoreys) ?? 0,\n                numberOfSubdivisions: Number(this.params.numberOfSubdivisions ?? 0),\n                outdoorLivingArea: Number(this.params.outdoorLivingArea ?? 0),\n                RCConstructionCalculated: Number(this.params.RCConstructionCalculated ?? 0),\n                RCLandscape: Number(this.params.RCLandscape ?? 0),\n                rcDocContribution: Number(this.params.rcDocContribution ?? 0),\n                realEstateAgentFee: Number(this.params.realEstateAgentFee ?? 0),\n                saleCommission: Number(this.params.saleCommission),\n                secondTierFinancing: Number(this.params.secondTierFinancing ?? 0),\n                secondTierInterest: Number(this.params.secondTierInterest ?? 0),\n                secondTierInvestor: this.params.secondTierInvestor ?? 0,\n                secondTierLoan: Number(this.params.secondTierLoan ?? 0),\n                secondTierValue: Number(this.params.secondTierValue ?? 0),\n                sectionPurchasePrice: Number(this.params.sectionPurchasePrice ?? 0),\n                sectionSize: Number(this.params.sectionSize ?? 0),\n                subdivisionFeeCalculated: Number(this.params.subdivisionFeeCalculated ?? 0),\n                totalBCLand: Number(this.params.totalBCLand ?? 0),\n                totalFloorArea: Number(this.params.totalFloorArea ?? 0),\n                totalInHand: Number(this.params.totalInHand ?? 0),\n            };\n        }\n    }\n    processInputs(): void {\n        if (this.calculations) {\n            this.dataIn = {\n                agentFee: this.calculations.agentFee ?? {name: '', value: 0},\n                averageFloorArea: Number(this.calculations.averageFloorArea ?? 0),\n                buildingCoverageArea: Number(this.calculations.buildingCoverageArea ?? 0),\n                constructionCost: Number(this.calculations.constructionCost ?? 0),\n                professionalFee: Number(this.calculations.professionalFee ?? 0),\n                expectedSalePrice: Number(this.calculations.expectedSalePrice ?? 0),\n                landscapedArea: Number(this.calculations.landscapedArea ?? 0),\n                numberOfStoreys: Number(this.calculations.numberOfStoreys ?? 0),\n                numberOfSubdivisions: Number(this.calculations.numberOfSubdivisions ?? 0),\n                outdoorLivingArea: Number(this.calculations.outdoorLivingArea ?? 0),\n                saleCommission: Number(this.calculations.saleCommission ?? 0),\n                secondTierFinancing: Number(this.calculations.secondTierFinancing ?? 0),\n                secondTierInterest: Number(this.calculations.secondTierInterest ?? 0),\n                secondTierValue: Number(this.calculations.secondTierValue ?? 0),\n                sectionPurchasePrice: Number(this.calculations.sectionPurchasePrice ?? 0),\n                sectionSize: Number(this.calculations.sectionSize ?? 0),\n                totalFloorArea: Number(this.calculations.totalFloorArea ?? 0)\n            };\n        }\n    }\n\n    handleData(): void {\n        if (this.calculations) {\n            this.processInputs();\n            this.expectedSalePrice = Math.floor((this.calculations.numberOfSubdivisions ?? 0) * (this.calculations.expectedSalePrice ?? 0));\n            this.realEstateAgentFee = Math.floor(this.calculations.saleCommission ?? 0);\n            this.totalInHand = this.expectedSalePrice - this.realEstateAgentFee;\n            this.subdivisionFeeCalculated = Math.floor((this.calculations.numberOfSubdivisions ?? 0) * (Math.random() * 2000 + 119000) / 2);\n            this.RCConstructionCalculated = Math.floor((this.calculations.numberOfSubdivisions ?? 0) * (Math.random() * 2000 + 119000) / 2);\n            this.RCLandscape = Math.floor((this.calculations.landscapedArea ?? 0) * 30);\n            this.params.RCLandscape = this.RCLandscape;\n            this.params.expectedSalePrice = this.expectedSalePrice;\n            this.params.realEstateAgentFee = this.realEstateAgentFee;\n            this.params.totalInHand = this.totalInHand;\n            this.params.subdivisionFeeCalculated = this.subdivisionFeeCalculated;\n            this.params.RCConstructionCalculated = this.RCConstructionCalculated;\n            this.params.bcConstruction = (this.calculations.totalFloorArea ?? 0) * (this.calculations.constructionCost ?? 0);\n            this.bcConstruction = this.params.bcConstruction;\n            this.params.secondTierLoan = (\n                (this.calculations.secondTierValue ?? 0) + this.params.bcConstruction + this.RCConstructionCalculated)\n                * ((this.calculations.secondTierFinancing ?? 0) / 100);\n            this.params.expectedMonth = ((this.calculations.numberOfSubdivisions ?? 0) - 2) * 1.2 + 18;\n            this.params.secondTierInterest = ((this.calculations.secondTierInterest ?? 0) / 100) * this.params.secondTierLoan / 12 * this.params.expectedMonth;\n            this.params.totalBCLand = this.params.bcConstruction + (this.calculations.sectionPurchasePrice ?? 0);\n            this.params.rcDocContribution = this.subdivisionFeeCalculated + this.RCConstructionCalculated;\n            this.params.saleCommission = (this.calculations.saleCommission ?? 0);\n            this.params.cashOnlyPlayer = this.params.rcDocContribution + this.params.totalBCLand;\n            this.params.secondTierInvestor = (\n                ((this.calculations.sectionPurchasePrice ?? 0) + this.params.bcConstruction)\n                * (1 - ((this.calculations.secondTierFinancing ?? 0) / 100))\n                + this.subdivisionFeeCalculated\n                + ((this.calculations.sectionPurchasePrice ?? 0)\n                    - (this.calculations.secondTierValue ?? 0)\n                    * (1 - ((this.calculations.secondTierFinancing ?? 0) / 100)))\n            );\n            this.params = Object.assign(this.params, this.calculations);\n            this.processOutputs();\n            this.processDataPackage();\n        }\n    }\n\n    processDataPackage(): void {\n        if (this.calculations) {\n            if (this.calculations.zoneKey && this.calculations.zoneValue) {\n                this.siteZone = {key: this.calculations.zoneKey, value: this.calculations.zoneValue};\n            }\n            this.dataStore = {\n                zone: this.siteZone,\n                dataIn: this.dataIn,\n                dataOut: this.dataOut,\n                sites: this.calculations.selectedSiteObjects?.map(so => so.core) ?? []\n            };\n        }\n    }\n}\n\n","<p-toast  key=\"subdivisionCalculationDetails\" position=\"top-center\"></p-toast>\n<div class=\"heading w-100\">\n    <p-tabView orientation=\"right\">\n        <p-tabPanel header=\"Subdivision Outcome\">\n            <ng-template pTemplate=\"content\">\n                <acaland-subdivision-calculation-result\n                    [dataStore]=\"dataStore\"\n                    [siteId]=\"siteId\"\n                    [projectId]=\"projectId\"\n                    [param]=\"params\"\n                    [siteZone]=\"siteZone\"></acaland-subdivision-calculation-result>\n            </ng-template>\n        </p-tabPanel>\n        <p-tabPanel header=\"Analysis\">\n            <ng-template pTemplate=\"content\">\n                <acaland-subdivision-calculation-analysis [params]=\"params\"></acaland-subdivision-calculation-analysis>\n            </ng-template>\n        </p-tabPanel>\n    </p-tabView>\n</div>\n","import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core';\nimport {FormControl, FormGroup, Validators} from '@angular/forms';\nimport {\n    AcabimSite,\n    LandPropertyParcelInfo,\n    ObservableLoadingListener,\n    SubDivisionCalculation,\n    SubDivisionCalculationInput,\n    SubDivisionCalculationZone,\n    SubdivisionCalculationService,\n} from '@cas-hub/acabim-common-client';\nimport {HttpErrorResponse} from '@angular/common/http';\nimport {MessageService} from 'primeng/api';\nimport {debounce} from 'rxjs/operators';\nimport {Observable, Subscription, timer} from 'rxjs';\nimport {Store} from '@ngrx/store';\n// @ts-ignore\nimport * as SubdivisionActions from '../../../_store/subdivision/subdivision.actions';\nimport {SubdivisionCalculationModel} from '../../../_models/subdivision-calculation.model';\n@Component({\n    selector: 'acaland-subdivision-calculation',\n    templateUrl: './subdivision-calculation.component.html',\n    styleUrls: ['./subdivision-calculation.component.scss'],\n    providers: [MessageService]\n})\nexport class SubdivisionCalculationComponent extends ObservableLoadingListener<LandPropertyParcelInfo> implements OnInit, OnDestroy {\n\n    debug = true;\n\n    _siteZone?: { key: string, value: string };\n    buildingCoverageFlag = false;\n    calculationData$: Observable<any> = new Observable<any>();\n    calculations: SubdivisionCalculationModel | null = null;\n    defaultData: SubDivisionCalculationInput;\n    initialDefaultSectionPurchasePrice = 0;\n    isLoading = false;\n    outdoorLivingArea = 20;\n    override = false;\n    projectId: string | null = null;\n    saleCommission: number | undefined;\n    sectionSizeFlag = false;\n    selectedSiteObjects: AcabimSite[] = [];\n    selectedSites: string[] = [];\n    showModal = false;\n    siteArea: number;\n    siteId: string | null = null;\n    storedData: SubDivisionCalculation | null = null;\n    subCalculationData: Subscription = new Subscription();\n    subdivisionSub: Subscription = new Subscription();\n\n    agentFeeOption: { name: string, value: number }[] = [\n        {name: '3%', value: 0.03},\n        {name: '4%', value: 0.04},\n        {name: '5%', value: 0.05},\n        {name: '6%', value: 0.06},\n        {name: '7%', value: 0.07},\n        {name: '8%', value: 0.08}\n    ];\n    baseDefaults: SubDivisionCalculationInput = {\n        agentFee: { name: '3%', value: 0.03},\n        averageFloorArea: 50,\n        buildingCoverageArea: 0,\n        constructionCost: 2750,\n        expectedSalePrice: 1200000,\n        landscapedArea: 0,\n        numberOfStoreys: 1,\n        numberOfSubdivisions: 1,\n        outdoorLivingArea: 0,\n        professionalFee: 100,\n        saleCommission: 1000,\n        secondTierFinancing: 60,\n        secondTierInterest: 10,\n        secondTierValue: 1200000,\n        sectionPurchasePrice: 1000000,\n        sectionSize: 0,\n        totalFloorArea: 0,\n    };\n    subdivisionForm: FormGroup = new FormGroup({\n        // projectInput\n        averageFloorArea: new FormControl(null,\n            [Validators.required, Validators.min(40), Validators.max(200), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        numberOfStoreys: new FormControl(1,\n            [Validators.required, Validators.min(1), Validators.max(6), Validators.pattern('^[0-9]+$')]),\n        numberOfSubdivisions: new FormControl(1,\n            [Validators.required, Validators.min(1), Validators.max(5000), Validators.pattern('^[0-9]+$')]),\n        // financing\n        agentFee: new FormControl(null, Validators.required),\n        constructionCost: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(30000), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        expectedSalePrice: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(30000000), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        saleCommission: new FormControl(0, Validators.required),\n        secondTierFinancing: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(100), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        secondTierInterest: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(50), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        secondTierValue: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(30000000), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n        sectionPurchasePrice: new FormControl(0,\n            [Validators.required, Validators.min(0), Validators.max(30000000), Validators.pattern('^[0-9]+(\\.[0-9]{1,2})?$')]),\n    });\n\n    @Input() public set siteAndProject(value: {site: string, project: string} | null) {\n        if (value !== null && typeof value !== 'undefined') {\n            this.siteId = value.site;\n            this.projectId = value.project;\n            this.getExistingCalculation();\n        }\n    }\n\n    @Input() public set siteOverride(value: AcabimSite[]) {\n        if (value.length > 0) {\n            this.override = true;\n            let currentSize = 0;\n            this.selectedSiteObjects = [];\n            this.selectedSites = [];\n            value.map(site => {\n                currentSize = currentSize + site.area;\n                this.selectedSites.push(site.id);\n                this.selectedSiteObjects.push(site);\n            });\n            // this.defaultData.sectionSize = currentSize;\n        }\n    }\n    @Input() public set loading(value: boolean) {\n        this.isLoading = value;\n    }\n\n    @Output() objectToDesignParams = new EventEmitter<{ buildingCoverageRatio: number; landscapedAreaRatio: number; }>();\n    @Output() sitesRetrieved = new EventEmitter<AcabimSite[]>();\n    @Output() zoneRetrieved = new EventEmitter<SubDivisionCalculationZone>();\n\n\n    /* ==== CONSTRUCTOR  ==== */\n    constructor(\n        private store: Store<any>,\n        private readonly messageService: MessageService,\n        private readonly subdivisionCalculationService: SubdivisionCalculationService\n    ) {\n        super(undefined);\n        this.calculationData$ = this.store.select('subdivision');\n        let firstTime = true;\n        this.subCalculationData = this.calculationData$.subscribe(d => {\n            this.calculations = d;\n            // check validity\n            this.buildingCoverageFlag = (d.averageFloorArea * d.numberOfSubdivisions) > d.buildingCoverageArea;\n            // check validity\n            this.sectionSizeFlag = ((d.averageFloorArea * d.numberOfSubdivisions) + d.outdoorLivingArea) > d.sectionSize;\n            if (firstTime) {\n                this.subdivisionForm?.get('averageFloorArea')?.setValue(d.averageFloorArea);\n                this.subdivisionForm?.get('numberOfStoreys')?.setValue(d.numberOfStoreys);\n                this.formInit();\n                firstTime = false;\n            }\n            if (d.averageFloorArea && this.subdivisionForm?.get('averageFloorArea')?.value !== d.averageFloorArea) {\n                this.subdivisionForm?.get('averageFloorArea')?.setValue(d.averageFloorArea);\n            }\n            if (d.numberOfStoreys && this.subdivisionForm?.get('numberOfStoreys')?.value !== d.numberOfStoreys) {\n                this.subdivisionForm?.get('numberOfStoreys')?.setValue(d.numberOfStoreys);\n            }\n            if (d.numberOfSubdivisions && this.subdivisionForm?.get('numberOfSubdivisions')?.value !== d.numberOfSubdivisions && d.numberOfSubdivisions > 0) {\n                this.subdivisionForm?.get('numberOfSubdivisions')?.setValue(d.numberOfSubdivisions);\n            }\n            if (d.constructionCost && this.subdivisionForm?.get('constructionCost')?.value !== d.constructionCost) {\n                this.subdivisionForm?.get('constructionCost')?.setValue(d.constructionCost);\n            }\n            if (this.subdivisionForm?.get('expectedSalePrice')?.value !== d.expectedSalePrice) {\n                this.subdivisionForm?.get('expectedSalePrice')?.setValue(d.expectedSalePrice);\n            }\n            if (this.subdivisionForm?.get('saleCommission')?.value !== d.saleCommission) {\n                this.subdivisionForm?.get('saleCommission')?.setValue(d.saleCommission);\n            }\n            if (this.subdivisionForm?.get('secondTierFinancing')?.value !== d.secondTierFinancing) {\n                this.subdivisionForm?.get('secondTierFinancing')?.setValue(d.secondTierFinancing);\n            }\n            if (this.subdivisionForm?.get('secondTierInterest')?.value !== d.secondTierInterest) {\n                this.subdivisionForm?.get('secondTierInterest')?.setValue(d.secondTierInterest);\n            }\n            if (this.subdivisionForm?.get('secondTierValue')?.value !== d.secondTierValue) {\n                this.subdivisionForm?.get('secondTierValue')?.setValue(d.secondTierValue);\n            }\n            if (this.subdivisionForm?.get('sectionPurchasePrice')?.value !== d.sectionPurchasePrice) {\n                this.subdivisionForm?.get('sectionPurchasePrice')?.setValue(d.sectionPurchasePrice.toFixed(0));\n            }\n            if (this.subdivisionForm?.get('agentFee')?.value !== d.agentFee) {\n                this.subdivisionForm?.get('agentFee')?.setValue(d.agentFee);\n            }\n        });\n        this.defaultData = this.baseDefaults;\n        this.siteArea = 0;\n        this.getExistingCalculation();\n    }\n\n    ngOnInit(): void {\n        this.getExistingCalculation();\n    }\n\n    ngOnDestroy(): void {\n        this.subCalculationData.unsubscribe();\n        this.subdivisionSub.unsubscribe();\n    }\n\n    onRefreshData(): void {}\n\n    formInit() {\n        if (this.calculations && this.subdivisionForm) {\n            this.subdivisionForm.get('averageFloorArea')?.valueChanges.pipe(debounce(() => timer(1000))).subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onAverageFloorArea({averageFloorArea: Number(x)}));\n                    this.subdivisionForm.get('numberOfSubdivisions')?.setValue(this.calculations?.numberOfSubdivisions);\n                } else if (x === 0) {\n                    this.messageService.clear();\n                    this.messageService.add({\n                        severity: 'error',\n                        summary: 'Floor area must be greater than 0.'\n                    });\n                }\n            });\n            this.subdivisionForm.get('numberOfStoreys')?.valueChanges.pipe(debounce(() => timer(1000))).subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onNumberOfStoreys({numberOfStoreys: Number(x)}));\n                } else if (x === 0) {\n                    this.messageService.clear();\n                    this.messageService.add({\n                        severity: 'error',\n                        summary: 'Number of storeys must be 1 or more.'\n                    });\n                }\n            });\n            this.subdivisionForm.get('numberOfSubdivisions')?.valueChanges.subscribe((x: number) => {\n                if (x && x > 0) {\n                    this.store.dispatch(SubdivisionActions.onNumberOfSubDivisions({numberOfSubDivisions: Number(x)}));\n                } else if (x === 0) {\n                    this.messageService.clear();\n                    this.messageService.add({\n                        severity: 'error',\n                        summary: 'Number of lots must be 1 or more.'\n                    });\n                }\n            });\n            // finance\n            this.subdivisionForm.get('expectedSalePrice')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onExpectedSalePrice({expectedSalePrice: Number(x)}));\n                }\n            });\n            this.subdivisionForm.get('secondTierValue')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onSecondTierValue({secondTierValue: Number(x)}));\n                }\n            });\n            this.subdivisionForm.get('secondTierFinancing')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onSecondTierFinancing({secondTierFinancing: Number(x)}));\n                }\n            });\n            this.subdivisionForm.get('secondTierInterest')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onSecondTierInterest({secondTierInterest: Number(x)}));\n                }\n            });\n            this.subdivisionForm.get('constructionCost')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onConstructionCost({constructionCost: Number(x)}));\n                }\n            });\n            this.subdivisionForm.get('agentFee')?.valueChanges.subscribe((x: any) => {\n                this.store.dispatch(SubdivisionActions.onAgentPercentage({agentPercentage: x}));\n            });\n            this.subdivisionForm.get('saleCommission')?.valueChanges.subscribe((x: number) => {\n                if (x && this.checkFormValidity()) {\n                    this.store.dispatch(SubdivisionActions.onSalesCommission({salesCommission: Number(x)}));\n                }\n            });\n        }\n    }\n\n    formDefaults(): void {\n        if (this.baseDefaults !== null) {\n            this.defaultData = this.baseDefaults;\n        }\n        this.initialDefaultSectionPurchasePrice = this.defaultData?.sectionPurchasePrice;\n    }\n\n    protected handleError(error: Error): void {\n        const httpError = error as HttpErrorResponse;\n        if (httpError && httpError.status === 404) {\n            this.data = undefined;\n        } else {\n            super.handleError(error);\n        }\n    }\n\n    checkFormValidity(): boolean {\n        return this.subdivisionForm.valid;\n    }\n\n    calculate() {\n        this.showModal = true;\n    }\n\n    changeModalStatus($event: boolean): void {\n        this.showModal = $event;\n    }\n\n    getExistingCalculation(): void {\n        if (typeof this.siteId !== 'undefined' && typeof this.projectId !== 'undefined' && this.siteId !== null && this.projectId !== null) {\n            this.subdivisionSub = this.subdivisionCalculationService.getData(this.siteId, this.projectId).subscribe(calc => {\n                if (typeof calc.dataOut !== 'undefined' && calc.dataOut !== null) {\n                    this.storedData = calc;\n                    this.defaultData = calc.dataOut;\n                    this.store.dispatch(SubdivisionActions.onDefaults({defaults: calc.dataOut}));\n                    // if (this.selectedSiteObjects) {\n                    //     let currentSize = 0;\n                    //     this.selectedSiteObjects.forEach(site => {\n                    //             currentSize = currentSize + +site.area;\n                    //     });\n                    //     // should retrieve the section purchase price from the project, if available\n                    //     this.subdivisionForm?.get('sectionPurchasePrice')?.patchValue(calc.dataOut.sectionPurchasePrice);\n                    //     this.defaultData.sectionSize = currentSize;\n                    //     if (+currentSize === 0) {\n                    //         currentSize = this.siteArea;\n                    //     }\n                    //     this.subdivisionForm?.get('sectionSize')?.setValue(currentSize);\n                    // }\n                    // @ts-ignore\n                    if (calc.zone !== null && typeof calc.zone !== 'undefined') {\n                        // @ts-ignore\n                        this.store.dispatch(SubdivisionActions.onZone({zone: calc.zone}));\n                        this.zoneRetrieved.emit(calc.zone);\n                    }\n                    if (calc.sites) {\n                        this.sitesRetrieved.emit(calc.sites);\n                    }\n                    // this.handleRegion();\n                    this.formInit();\n                } else {\n                    this.zoneRetrieved.emit(undefined);\n                }\n            });\n        }\n    }\n\n    copyPropertyDetails(elementId: string): void {\n        const parent = document.querySelector('#' + elementId);\n        if (parent) {\n            const all: string[] = [];\n            parent.querySelectorAll('.cas-row')?.forEach(row => {\n                const tmp: string[] = [];\n                const label = row.querySelectorAll('.cas-col.cas-col-label')[0]?.firstChild?.nodeValue;\n                tmp.push(label ?? '');\n                const value = row.querySelectorAll('.cas-col.cas-col-details acabim-data-cell')[0]?.firstChild?.nodeValue;\n                tmp.push(value ?? '');\n                all.push(tmp.join('\\t'));\n            });\n            const final = all.join('\\n');\n            navigator.clipboard.writeText(final).then(() => {\n                console.log('Copied', final);\n            });\n        }\n    }\n}\n","\n<form>\n    <div class=\"cas-flex-row\" *ngIf=\"calculations?.zoneKey; else noZone\">\n        <ng-container *ngIf=\"calculations?.cap; else loadingView\">\n            <div class=\"col-md-6 cas-pad-2\">\n                <acabim-card [cardContent]=\"projectInput\" cardHeading=\"Property Parameters\"></acabim-card>\n            </div>\n            <div class=\"col-md-6 cas-pad-2\">\n                <acabim-card [cardContent]=\"financing\" cardHeading=\"Financial Parameters (ex GST)\"></acabim-card>\n            </div>\n            <div class=\"col-md-6\">\n                <div class=\"cas-action-buttons\">\n                    <button class=\"cas-button-action\" (click)=\"calculate()\">Calculate</button>\n                </div>\n            </div>\n        </ng-container>\n    </div>\n</form>\n\n<ng-template #projectInput>\n    <form [formGroup]=\"subdivisionForm\" *ngIf=\"!isLoading else loadingView\" id=\"projectInput\">\n        <div class=\"cas-flex-row\">\n            <!--\n            <div class=\"cas-flex-row w-100\">\n                <ng-container *ngIf=\"sectionSizeFlag\">\n                    <p class=\"cas-error\">You have exceeded the land area!</p>\n                </ng-container>\n                <ng-container *ngIf=\"buildingCoverageFlag && !sectionSizeFlag\">\n                    <p class=\"cas-error\">You have violated the maximum building coverage threshold!</p>\n                </ng-container>\n            </div>\n            !-->\n            <acabim-form-block labelWidth=\"12\" [labelAlign]=\"'right'\" class=\"col-md-6\" [shortFields]=\"true\" [colonize]=\"true\">\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Average floor area per storey</acabim-form-input-label>\n                        <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\" [form]=\"subdivisionForm\" [controlName]=\"'averageFloorArea'\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"averageFloorArea\"/>\n                            <span class=\"cas-form-units\">m²</span>\n                        </div>\n                        </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Number of storeys per lot</acabim-form-input-label>\n                        <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\" [form]=\"subdivisionForm\" [controlName]=\"'numberOfStoreys'\">\n                            <div class=\"cas-form-input-wrapper number\">\n                                <input class=\"cas-edit-input\" formControlName=\"numberOfStoreys\"/>\n                                <span class=\"cas-form-units\"> </span>\n                            </div>\n                        </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Number of lots/subdivisions</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\" [form]=\"subdivisionForm\" [controlName]=\"'numberOfSubdivisions'\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"numberOfSubdivisions\"/>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Section/land area</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div>{{calculations?.sectionSize.toFixed(0) | number}}</div>\n                            <span class=\"cas-form-units\">m²</span>\n                            <acabim-icon-info message=\"The extent of proposed development ({{(calculations?.averageFloorArea * calculations?.numberOfSubdivisions) + calculations?.outdoorLivingArea}} m²)\n                            has exceeded the land area of {{calculations?.sectionSize.toFixed(0) | number}} m²!\"\n                                              type=\"error\" *ngIf=\"sectionSizeFlag\"></acabim-icon-info>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Total building floor area</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div>{{calculations?.totalFloorArea | number}}</div>\n                            <span class=\"cas-form-units\">m²</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Max building coverage {{calculations?.cap?.buildingCoverageRatio * 100 ? '(' + calculations?.cap?.buildingCoverageRatio * 100 + '%)' : ''}}</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div>{{calculations?.buildingCoverageArea | number}}</div>\n                            <span class=\"cas-form-units\">m²</span>\n                            <acabim-icon-info message=\"Total building footprint ({{calculations?.averageFloorArea * calculations?.numberOfSubdivisions}} m²) has violated\n                            the prescribed {{calculations?.cap?.buildingCoverageRatio * 100 ? calculations?.cap?.buildingCoverageRatio * 100 : ''}}% maximum building coverage threshold ({{calculations?.buildingCoverageArea}} m²)!\"\n                                              type=\"error\" *ngIf=\"buildingCoverageFlag\"></acabim-icon-info>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Total outdoor living area</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div>{{calculations?.outdoorLivingArea}}</div>\n                            <span class=\"cas-form-units\">m²</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Min landscaped\n                        area {{calculations?.cap?.landscapedAreaRatio * 100 ? '(' + calculations?.cap?.landscapedAreaRatio * 100 + '%)' : ''}}</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div>{{calculations?.landscapedArea | number}}</div>\n                            <span class=\"cas-form-units\">m²</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n            </acabim-form-block>\n        </div>\n    </form>\n</ng-template>\n\n<ng-template #financing>\n    <form [formGroup]=\"subdivisionForm\" *ngIf=\"!isLoading else loadingView\" id=\"financing\">\n        <div class=\"cas-flex-row\">\n            <acabim-form-block labelWidth=\"12\" [labelAlign]=\"'right'\" class=\"col-md-6\" [shortFields]=\"true\" [colonize]=\"true\">\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Property purchase price</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"sectionPurchasePrice\"/>\n                            <span class=\"cas-form-units\">$</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Expected sale price per Lot</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"expectedSalePrice\"/>\n                            <span class=\"cas-form-units\">$</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Property value for 2<sup>nd</sup> tier</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"secondTierValue\"/>\n                            <span class=\"cas-form-units\">$</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">2<sup>nd</sup> tier financing</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"secondTierFinancing\"/>\n                            <span class=\"cas-form-units\">%</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">2<sup>nd</sup> tier interest rate</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"secondTierInterest\"/>\n                            <span class=\"cas-form-units\">%</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Construction cost per m²</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"constructionCost\"/>\n                            <span class=\"cas-form-units\">$/m²</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">Professional fee per m²</acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <div class=\"shortCurrency\">{{calculations?.professionalFee | currency}}</div>\n                            <span class=\"cas-form-units\">/&nbsp;m²</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n                <acabim-form-input-wrapper>\n                    <acabim-form-input-label class=\"fireSafetyFormsLabel\">\n                        Commissions\n                        <p-dropdown\n                            appendTo=\"body\"\n                            formControlName=\"agentFee\"\n                            [options]=\"agentFeeOption\"\n                            optionLabel=\"name\"\n                            placeholder=\"(%)\"\n                        ></p-dropdown>\n                    </acabim-form-input-label>\n                    <acabim-form-input-content [exShortField]=\"true\" [numeric]=\"true\">\n                        <div class=\"cas-form-input-wrapper number\">\n                            <input class=\"cas-edit-input\" formControlName=\"saleCommission\"/>\n                            <span class=\"cas-form-units\">$</span>\n                        </div>\n                    </acabim-form-input-content>\n                </acabim-form-input-wrapper>\n\n\n\n            </acabim-form-block>\n        </div>\n    </form>\n</ng-template>\n<p-toast position=\"center\"></p-toast>\n<ng-template [ngIf]=\"showModal\">\n    <acabim-modal\n        width=\"80vw\"\n        fixHeight=\"80vh\"\n        [display]=\"true\"\n        (status)=\"changeModalStatus($event)\"\n        [title]=\"'Calculation Result'\">\n        <acaland-subdivision-calculation-detail\n            [siteId]=\"siteId\"\n            [projectId]=\"projectId\">\n        </acaland-subdivision-calculation-detail>\n    </acabim-modal>\n</ng-template>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n\n<ng-template #noZone>\n    <div class=\"cas-error\">Please select a planning zone to start with.</div>\n</ng-template>\n","import {Component, Input} from '@angular/core';\nimport {\n    GenericPayloadClass,\n    GenericPayloadModel,\n    GenericPayloadType,\n    LandPropertyParcelInfo\n} from '@cas-hub/acabim-common-client';\nimport {Observable} from 'rxjs';\nimport {Store} from '@ngrx/store';\n\n@Component({\n    selector: 'acaland-property-parcel-data-viewer',\n    templateUrl: './property-parcel-data-viewer.component.html',\n    styleUrls: ['./property-parcel-data-viewer.component.scss']\n})\nexport class PropertyParcelDataViewerComponent {\n    calculationData$: Observable<any> = new Observable<any>();\n    isLoading = false;\n    propertyDataNgrx: LandPropertyParcelInfo | null = null;\n    payload: GenericPayloadModel[] = [];\n    columnHeaders: string[] = [\n        'Attribute',\n        'Value'\n    ];\n\n    private genericPayloadClass: GenericPayloadClass = new GenericPayloadClass();\n\n    @Input()\n    public set loading(value: boolean) {\n        this.isLoading = value;\n    }\n\n\n    constructor(private store: Store<any>) {\n        this.calculationData$ = this.store.select('subdivision');\n        this.calculationData$.subscribe(d => {\n            if (d.linz && d.linz.property) {\n                this.propertyDataNgrx = d.linz.property;\n            } else {\n                this.propertyDataNgrx = null;\n            }\n            this.setData();\n        });\n    }\n\n    setData(): void {\n        if (this.propertyDataNgrx) {\n            this.genericPayloadClass = new GenericPayloadClass();\n            this.genericPayloadClass.objectIn = this.propertyDataNgrx;\n            this.genericPayloadClass.handleProperty('titleNo', 'Title No.');\n            this.genericPayloadClass.handleProperty('status');\n            this.genericPayloadClass.handleProperty('titleType');\n            this.genericPayloadClass.handleProperty('landDistrict');\n            this.genericPayloadClass.handleProperty('issueDate', undefined, GenericPayloadType.date);\n            this.genericPayloadClass.handleProperty('guaranteeStatus');\n            this.genericPayloadClass.handleProperty('estateDescription');\n            this.genericPayloadClass.handleProperty('numberOfOwners', 'Number of Owners', GenericPayloadType.number);\n            this.genericPayloadClass.handleProperty('shared');\n            this.genericPayloadClass.handleProperty('landDistrict');\n            this.genericPayloadClass.handleProperty('legalDescription50772', 'Legal description (Survey)');\n            this.genericPayloadClass.handleProperty('depositPlanNumber50772', 'Deposit Plan # (Survey)');\n            this.genericPayloadClass.handleProperty('parcelIntent50772', 'Parcel intent (Survey)');\n            this.genericPayloadClass.handleProperty('topology50772', 'Topology (Survey)');\n            this.genericPayloadClass.handleProperty('statsActions50772', 'Stats actions (Survey)');\n            this.genericPayloadClass.handleProperty('titles50772', 'Titles (Survey)');\n            this.genericPayloadClass.handleProperty('surveyArea50772', 'Survey area (Survey)', GenericPayloadType.sqm);\n            this.genericPayloadClass.handleProperty('calcArea50772', 'Calc area (Survey)', GenericPayloadType.sqm);\n            this.genericPayloadClass.handleProperty('legalDescription51571', 'Legal description');\n            this.genericPayloadClass.handleProperty('depositPlanNumber51571', 'Deposit Plan #');\n            this.genericPayloadClass.handleProperty('parcelIntent51571', 'Parcel intent');\n            this.genericPayloadClass.handleProperty('topology51571', 'Topology');\n            this.genericPayloadClass.handleProperty('statsActions51571', 'Stats actions');\n            this.genericPayloadClass.handleProperty('titles51571', 'Titles');\n            this.genericPayloadClass.handleProperty('surveyArea51571', 'Survey area', GenericPayloadType.sqm);\n            this.genericPayloadClass.handleProperty('calcArea51571', 'Calc area', GenericPayloadType.sqm);\n            this.payload = this.genericPayloadClass.getPayload();\n        } else {\n            this.payload = [];\n        }\n    }\n}\n","<ng-container *ngIf=\"!isLoading; else loadingView\">\n    <div class=\"col-md-12 cas-pad\" *ngIf=\"payload.length > 0\">\n        <acabim-data-display\n            [dataMap]=\"payload\"\n            [columnHeaders]=\"columnHeaders\"\n            [copy]=\"true\"\n            [atFoot]=\"true\"\n            labelWidth=\"12rem\"\n            labelAlignment=\"right\"\n            valueAlignment=\"left\"></acabim-data-display>\n    </div>\n    <div class=\"col-md-12\" *ngIf=\"payload.length < 1\">\n        <div class=\"cas-error\">No property and parcel data available.</div>\n    </div>\n</ng-container>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n","import {Component, Input} from '@angular/core';\nimport {\n    GenericPayloadClass,\n    GenericPayloadModel,\n    GenericPayloadType,\n    LandTopoInfo,\n} from '@cas-hub/acabim-common-client';\nimport {Observable} from 'rxjs';\nimport {Store} from '@ngrx/store';\n\n@Component({\n    selector: 'acaland-topo-data-viewer',\n    templateUrl: './topo-data-viewer.component.html',\n    styleUrls: ['./topo-data-viewer.component.scss']\n})\nexport class TopoDataViewerComponent {\n    calculationData$: Observable<any> = new Observable<any>();\n    currentData?: LandTopoInfo;\n    isLoading = false;\n    payload: GenericPayloadModel[] = [];\n    topoDataNgrx: LandTopoInfo | null = null;\n    columnHeaders: string[] = [\n        'Attribute',\n        'Value'\n    ];\n\n    private genericPayloadClass: GenericPayloadClass = new GenericPayloadClass();\n\n    @Input()\n    public set loading(value: boolean) {\n        this.isLoading = value;\n    }\n\n    constructor(private store: Store<any>) {\n        this.calculationData$ = this.store.select('subdivision');\n        this.calculationData$.subscribe(d => {\n            if (d.linz && d.linz.topography) {\n                this.topoDataNgrx = d.linz.topography;\n            } else {\n                this.topoDataNgrx = null;\n            }\n            this.setData();\n        });\n    }\n\n    setData(): void {\n        if (this.topoDataNgrx) {\n            this.genericPayloadClass = new GenericPayloadClass();\n            this.genericPayloadClass.objectIn = this.topoDataNgrx;\n            this.genericPayloadClass.handleProperty('topoId');\n            this.genericPayloadClass.handleProperty('definition');\n            this.genericPayloadClass.handleProperty('designated');\n            this.genericPayloadClass.handleProperty('contour');\n            this.genericPayloadClass.handleProperty('elevation', undefined, GenericPayloadType.metres);\n            this.payload = this.genericPayloadClass.getPayload();\n        } else {\n            this.payload = [];\n        }\n    }\n}\n","<ng-container *ngIf=\"!isLoading; else loadingView\">\n    <div class=\"col-md-12 cas-pad\" *ngIf=\"payload.length > 0\">\n        <acabim-data-display\n            [dataMap]=\"payload\"\n            [columnHeaders]=\"columnHeaders\"\n            labelWidth=\"12rem\"\n            labelAlignment=\"right\"\n            valueAlignment=\"left\"\n            [atFoot]=\"true\"\n            [copy]=\"true\"></acabim-data-display>\n    </div>\n    <div class=\"col-md-12\" *ngIf=\"payload.length < 1\">\n        <div class=\"cas-error\">No topology data available.</div>\n    </div>\n</ng-container>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n","import {Component, OnInit, Output, EventEmitter, Input} from '@angular/core';\nimport {\n    AcabimSite,\n    SiteApiService,\n    Status\n} from '@cas-hub/acabim-common-client';\nimport {Observable} from 'rxjs';\nimport {MessageService} from 'primeng/api';\nimport {Store} from '@ngrx/store';\n// @ts-ignore\nimport * as SubdivisionActions from '../../../_store/subdivision/subdivision.actions';\n\n@Component({\n    selector: 'acaland-site-adjoin',\n    templateUrl: './site-adjoin.component.html',\n    styleUrls: ['./site-adjoin.component.scss'],\n    providers: [MessageService]\n})\nexport class SiteAdjoinComponent implements OnInit {\n\n    calculationData$: Observable<any> = new Observable<any>();\n    isLoading = false;\n    locationSite?: AcabimSite;\n    selectedSites: AcabimSite[] = [];\n    selectedSiteGuids: string[] = [];\n    sites: AcabimSite[] = [];\n    totalArea = 0;\n\n    @Output() returnedSites = new EventEmitter<AcabimSite[]>();\n\n    @Input()\n    public set initialSites(value: AcabimSite[]) {\n        if (value.length > 0) {\n            this.selectedSites = [];\n            value.map(site => {\n                this.add(site);\n            });\n        }\n    }\n\n    constructor(\n        private readonly siteApiService: SiteApiService,\n        private store: Store<any>\n    ) {\n        this.calculationData$ = this.store.select('subdivision');\n    }\n\n    ngOnInit(): void {\n        this.siteApiService.selectedSite$.subscribe(site => {\n            if (site) {\n                this.selectedSites = [];\n                this.locationSite = site;\n                this.add(site);\n            } else {\n                this.selectedSites = [];\n                this.returnedSites.emit(this.selectedSites);\n            }\n        });\n        this.isLoading = true;\n        this.siteApiService.getAllSites(undefined, {\n            includeCoordinates: true,\n            includeRegion: true,\n            includeGroups: false,\n            includeProjects: false,\n            filterStatus: Status.active\n        }, false)\n            .subscribe((val: any) => {\n                this.isLoading = false;\n                this.sites = val as AcabimSite[];\n            });\n    }\n\n    add(site: AcabimSite): void {\n        if (site && this.selectedSites.indexOf(site) < 0) {\n            this.selectedSiteGuids.push(site.id);\n            this.selectedSites.push(site);\n            this.store.dispatch(SubdivisionActions.onSingleSection({section: {core: site}}));\n            this.calculationTotalSelectedArea();\n            this.returnedSites.emit(this.selectedSites);\n        }\n    }\n\n    remove(site: AcabimSite): void {\n        const index = this.selectedSites.indexOf(site);\n        if (site && index > -1 && site.id !== this.locationSite?.id) {\n            const guidIndex = this.selectedSiteGuids.indexOf(site.id);\n            this.selectedSiteGuids.splice(guidIndex, 1);\n            this.selectedSites.splice(index, 1);\n            this.store.dispatch(SubdivisionActions.onDeleteSite({section: {core: site}}));\n            this.calculationTotalSelectedArea();\n            this.returnedSites.emit(this.selectedSites);\n        }\n    }\n\n    calculationTotalSelectedArea(): void {\n        let area = 0;\n        this.selectedSites.map(s => {\n            area += + s.area;\n        });\n        this.totalArea = area;\n    }\n\n}\n","<ng-container *ngIf=\"!isLoading else showLoader\">\n    <div class=\"cas-flex-row\">\n        <div class=\"p-col-6 cas-pad\">\n            <h4>Add a Site</h4>\n            <ng-container *ngIf=\"sites.length > 0\">\n                <div class=\"site-row-wrapper site-row-wrapper-adds\">\n                    <div class=\"site-row site-row-header\"><span class=\"site-row-name\">Site</span><span class=\"site-row-area\">Area</span></div>\n                    <ng-container *ngFor=\"let site of sites\">\n                        <ng-container *ngIf=\"selectedSiteGuids && selectedSiteGuids.indexOf(site.id) < 0\">\n                            <div class=\"site-row\" (click)=\"add(site)\"><span class=\"site-row-name\">{{site.name}}</span><span class=\"site-row-area\">{{site.area | number}}</span></div>\n                        </ng-container>\n                    </ng-container>\n                </div>\n            </ng-container>\n        </div>\n        <div class=\"p-col-6 cas-pad\">\n            <h4>Selected Site(s)</h4>\n            <div class=\"site-row-wrapper site-row-wrapper-deletes\">\n                <div class=\"site-row site-row-header\"><span class=\"site-row-name\">Site</span><span class=\"site-row-area\">Area</span></div>\n                <ng-container *ngFor=\"let selectedSite of selectedSites\">\n                    <div class=\"site-row\" (click)=\"remove(selectedSite)\" [class.hide-action]=\"selectedSite.id === locationSite?.id\">\n                        <span class=\"site-row-name\">{{selectedSite.name}}</span>\n                        <span class=\"site-row-area\">{{selectedSite.area | number}}\n                </span></div>\n                </ng-container>\n            </div>\n            <div class=\"site-row-wrapper site-row-total\">\n                <div class=\"site-row\"><span class=\"site-row-name\">Total area:</span><span class=\"site-row-area\">{{totalArea | number}}</span></div>\n            </div>\n        </div>\n    </div>\n</ng-container>\n\n<ng-template #showLoader>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n","import {Component, OnInit, OnDestroy} from '@angular/core';\nimport {FormControl, FormGroup} from '@angular/forms';\n\nimport {NGXLogger} from 'ngx-logger';\nimport {Observable, Subject, Subscription} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {MessageService} from 'primeng/api';\n\nimport {\n    // AcabimCommonComponent,\n    AcabimProject,\n    AcabimSite,\n    CapApiService, GenericPayloadModel,\n    LandApiService,\n    LandBuildingInfo,\n    LandPropertyParcelInfo,\n    LandTopoInfo,\n    LocationInfo,\n    MapConfig,\n    ProjectApiService,\n    ReportService,\n    SiteApiService, SubdivisionCalculationService, SubDivisionCalculationZone\n} from '@cas-hub/acabim-common-client';\nimport {AucklandUnitaryPlanZones} from '../../_models/aucklandUnitaryPlanZones.model';\nimport {BayOfPlentyPlanZones} from '../../_models/bayOfPlentyPlanZones.model';\nimport {CanterburyPlanZones} from '../../_models/canterburyPlanZones.model';\nimport {FranklinPlanZones} from '../../_models/franklinPlanZones.model';\nimport {GisbornePlanZones} from '../../_models/gisbornePlanZones.model';\nimport {HawkesBayPlanZones} from '../../_models/hawkesBayPlanZones.model';\nimport {ManawatuWanganuiPlanZones} from '../../_models/manawatuWanganuiPlanZones.model';\nimport {MarlboroughPlanZones} from '../../_models/marlboroughPlanZones.model';\nimport {NorthlandPlanZones} from '../../_models/northlandPlanZones.model';\nimport {OtagoPlanZones} from '../../_models/otagoPlanZones.model';\nimport {RuapehuPlanZones} from '../../_models/ruapehuPlanZones.model';\nimport {SouthWaikatoPlanZones} from '../../_models/southWaikatoPlanZones.model';\nimport {TaranakiPlanZones} from '../../_models/taranakiPlanZones.model';\nimport {TaurangaPlanZones} from '../../_models/taurangaPlanZones.model';\nimport {WaikatoPlanZones} from '../../_models/waikatoPlanZones.model';\nimport {WellingtonPlanZones} from '../../_models/wellingtonPlanZones.model';\nimport {WestCoastPlanZones} from '../../_models/westCoastPlanZones.model';\nimport {CapGetVariableResponse} from '@cas-hub/acabim-common-client/lib/_models/cap.model';\nimport {PostcodeService} from '../../_services/postcode.service';\nimport {RegionFromPostcode, AllRegions} from '../../_models/postcode.model';\nimport {Store} from '@ngrx/store';\n// @ts-ignore\nimport * as SubdivisionActions from '../../_store/subdivision/subdivision.actions';\nimport {DetailedSite, SubdivisionCalculationModel} from '../../_models/subdivision-calculation.model';\nimport {SubdivisionUtilitiesClass} from '../../_store/subdivision/subdivision-utilities.class';\nimport { SiteCacheManager } from '../../_services/site-cache-manager.service';\n\ninterface AuditResultData {\n    readonly name: string;\n    result: any;\n}\n\n@Component({\n    selector: 'acaland-land-development',\n    templateUrl: './land-development.component.html',\n    styleUrls: ['./land-development.component.scss'],\n    providers: [MessageService]\n\n})\nexport class LandDevelopmentComponent implements OnInit, OnDestroy { //  extends AcabimCommonComponent\n    isZoningCardCollapsed = true;\n    _designParams?: CapGetVariableResponse;\n    _initiallySelectedSites: AcabimSite[] = [];\n    _selectedSites: AcabimSite[] = [];\n    _selectedZone: SubDivisionCalculationZone | null = null;\n    calculationData$: Observable<any> = new Observable<any>();\n    calculationDataPayload: GenericPayloadModel[] = [];\n    calculations: SubdivisionCalculationModel | null = null;\n    changeZoneLookup = ''; // CapId to execute\n    coords?: number[][];\n    currentBuildingData?: LandBuildingInfo;\n    currentId?: string;\n    currentLocation?: LocationInfo;\n    currentParcel?: LandPropertyParcelInfo;\n    currentSiteId?: string;\n    currentTopoData?: LandTopoInfo;\n    designParamLoading = false;\n    designParamsData: AuditResultData[] = [];\n    financeDataPayload: GenericPayloadModel[] = [];\n    hideZone: boolean | undefined = true;\n    isCollapsed = true;\n    landForm: any;\n    landscapedAreaRatio = 0.35;\n    loadingBuildingData = false;\n    loadingParcel = false;\n    loadingTopoData = false;\n    lotNumberDataPayload: GenericPayloadModel[] = [];\n    mapConfig?: MapConfig;\n    maxParkingRate?: string;\n    nzPlanningRegions: AllRegions[] = [];\n    pendingReport = false;\n    planningZones: { key: string, value: string }[] = [];\n    postcode: string | null = null;\n    private postcodeServiceSub: Subscription = new Subscription();\n    private projectServiceSub: Subscription;\n    private regionsServiceSub: Subscription = new Subscription();\n    private siteServiceSub: Subscription = new Subscription();\n    private unsubscribe$ = new Subject<void>();\n    selectedProject?: AcabimProject | null;\n    selectedRegion: any;\n    selectedRegionFromPostcode: RegionFromPostcode | null = null;\n    selectedSite?: AcabimSite | null;\n    selectedZone?: any;\n    siteAndProject?: {site: string, project: string};\n    siteArea?: number;\n    subCalculationData: Subscription = new Subscription();\n    aupZones: { key: string, value: string }[] = [];\n    bayOfPlentyZones: { key: string, value: string }[] = [];\n    canterburyZones: { key: string, value: string }[] = [];\n    franklinZones: { key: string, value: string }[] = [];\n    gisborneZones: { key: string, value: string }[] = [];\n    hawkesBayZones: { key: string, value: string }[] = [];\n    marlboroughZones: { key: string, value: string }[] = [];\n    manawatuWanganuiZones: { key: string, value: string }[] = [];\n    northlandZones: { key: string, value: string }[] = [];\n    otagoZones: { key: string, value: string }[] = [];\n    ruapehuZones: { key: string, value: string }[] = [];\n    southWaikatoZones: { key: string, value: string }[] = [];\n    taranakiZones: { key: string, value: string }[] = [];\n    taurangaZones: { key: string, value: string }[] = [];\n    waikatoZones: { key: string, value: string }[] = [];\n    wellingtonZones: { key: string, value: string }[] = [];\n    westCoastZones: { key: string, value: string }[] = [];\n\n    constructor(\n        private readonly landApiService: LandApiService,\n        private readonly messageService: MessageService,\n        private readonly postcodeService: PostcodeService,\n        private readonly reportApiService: ReportService,\n        private readonly subdivisionCalculationService: SubdivisionCalculationService,\n        private readonly subdivisionUtilitiesService: SubdivisionUtilitiesClass,\n        private store: Store<any>,\n        protected readonly capApiService: CapApiService,\n        protected readonly logger: NGXLogger,\n        protected readonly projectApiService: ProjectApiService,\n        protected readonly siteApiService: SiteApiService,\n        protected readonly siteCacheManager: SiteCacheManager\n    ) {\n        // super(siteApiService, projectApiService, capApiService, logger);\n        this.calculationData$ = this.store.select('subdivision');\n        this.subCalculationData = this.calculationData$.subscribe(d => {\n            this.calculations = d;\n            this.calculationDataPayload = this.subdivisionUtilitiesService.handleDataDisplay(d);\n            this.lotNumberDataPayload = this.subdivisionUtilitiesService.handleDataDisplay(d.subDivisionParams);\n            this.financeDataPayload = this.subdivisionUtilitiesService.handleDataDisplay(d.financialParams);\n        });\n        this.projectServiceSub = this.projectApiService.selectedProject$.subscribe(project => {\n            this.selectedProject = project;\n        });\n\n        this.projectApiService.selectedProjectId$\n            .pipe(takeUntil(this.unsubscribe$))\n            .subscribe(projectId => {\n                if (projectId) {\n                    this.currentId = projectId;\n                    this.refreshCap(projectId);\n                }\n            });\n\n        this.aupZones = AucklandUnitaryPlanZones.aupZonesObj;\n        this.canterburyZones = CanterburyPlanZones.canterburyZonesObj;\n        this.bayOfPlentyZones = BayOfPlentyPlanZones.bayOfPlentyPlanZonesObj;\n        this.franklinZones = FranklinPlanZones.franklinPlanZonesObj;\n        this.gisborneZones = GisbornePlanZones.gisborneZonesObj;\n        this.hawkesBayZones = HawkesBayPlanZones.hawkesBayZonesObj;\n        this.manawatuWanganuiZones = ManawatuWanganuiPlanZones.manawatuWanganuiZonesObj;\n        this.marlboroughZones = MarlboroughPlanZones.marlboroughZonesObj;\n        this.northlandZones = NorthlandPlanZones.northlandZonesObj;\n        this.otagoZones = OtagoPlanZones.otagoZonesObj;\n        this.ruapehuZones = RuapehuPlanZones.ruapehuZonesObj;\n        this.southWaikatoZones = SouthWaikatoPlanZones.southWaikatoZonesObj;\n        this.taranakiZones = TaranakiPlanZones.taranakiZonesObj;\n        this.taurangaZones = TaurangaPlanZones.taurangaZonesObj;\n        this.waikatoZones = WaikatoPlanZones.waikatoPlanZonesObj;\n        this.westCoastZones = WestCoastPlanZones.westCoastZonesObj;\n        this.wellingtonZones = WellingtonPlanZones.wellingtonZonesObj;\n    }\n\n    ngOnInit(): void {\n        this.landForm = new FormGroup({\n            zoneSelection: new FormControl(),\n            selectedRegion: new FormControl()\n        });\n        this.siteServiceSub = this.siteApiService.selectedSite$.subscribe(site => {\n            this._selectedSites = [];\n            if (!site) {\n                    this._selectedSites = [];\n                    this.coords = undefined;\n                    this.currentId = undefined;\n                    this.currentLocation = undefined;\n                    this.currentParcel = undefined;\n                    this.mapConfig = undefined;\n                    this.selectedProject = null;\n                    this.selectedSite = undefined;\n                    this.landForm?.get('selectedRegion').setValue(null);\n                    this.landForm?.get('zoneSelection').setValue(null);\n                    this.store.dispatch(SubdivisionActions.onNoSite());\n                    this.isZoningCardCollapsed = true;\n            } else {\n                this.siteApiService.getSite(site.id, {includeRegion: true, includeCoordinates: true}).subscribe(s => {\n                    if (s && s.region) {\n                        this.selectedRegion = {key: s.region.region_key, value: s.region.region_name};\n                        this.store.dispatch(SubdivisionActions.onRegion({region: this.selectedRegion}));\n                        this.landForm.get('selectedRegion').setValue(this.selectedRegion);\n                        this.displayZonesSelection(this.selectedRegion);\n                    } else {\n                        this.selectedRegion = null;\n                        this.store.dispatch(SubdivisionActions.onRegion({region: null}));\n                    }\n                    if (s && s.coordinates) {\n                        this.coords = s.coordinates;\n                    }\n                });\n                this.selectedSite = site;\n                const currentLocation = new LocationInfo(site.latitude, site.longitude);\n                this._selectedSites.push(site);\n                this.landApiService.getPropertyParcelData(currentLocation).subscribe(data => {\n                    const detailedSite: DetailedSite = {core: site, property: data};\n                    this.store.dispatch(SubdivisionActions.onPrimarySite({site: detailedSite}));\n                });\n                this.currentSiteId = site.id;\n                this.regionsServiceSub = this.postcodeService.getAllRegions().subscribe(regions => {\n                    this.selectedRegion = null;\n                    this.hideZone = true;\n                    this.nzPlanningRegions = [{key: '', value: 'Select a Region'}];\n                    regions.data.map(rg => {\n                        this.nzPlanningRegions.push(rg);\n                    });\n                });\n                if (this.selectedSite) {\n                    this.selectedProject = null;\n                }\n                this.selectedSite = site;\n                this.projectServiceSub = this.projectApiService.selectedProject$.subscribe(project => {\n                    this.selectedProject = project;\n                    if (project !== null) {\n                        this.currentId = project.id;\n                        this.siteAndProject = {\n                            site: site.id,\n                            project: project.id\n                        };\n                        this.subdivisionCalculationService.getData(site.id, project.id).subscribe(data => {\n                            if (data && data.dataOut) {\n                                this.store.dispatch(SubdivisionActions.onDefaults({defaults: data.dataOut}));\n                                if (data.sites) {\n                                    const sections = data.sites.map(s => {\n                                        return { core: s };\n                                    });\n                                    this.store.dispatch(SubdivisionActions.onSections({sections}));\n                                }\n                                if (data.zone) {\n                                    const zone = data.zone;\n                                    this.landForm.get('zoneSelection').setValue(zone);\n                                    this.store.dispatch(SubdivisionActions.onZone({zone}));\n                                    const region = this.landForm.get('selectedRegion')?.value.key ?? this.selectedRegion?.key;\n                                    this.handleRegionDetails(region);\n                                    const execParams: [string, any][] = [];\n                                    execParams.push(['SiteZone', zone.key]);\n                                    this.capApiService.getVariableFromCap(\n                                        this.changeZoneLookup,\n                                        project.id ?? '',\n                                        execParams\n                                    ).subscribe(capData => {\n                                        this._designParams = undefined;\n                                        this._designParams = capData;\n                                        this.designParamsData = capData.results as AuditResultData[];\n                                        this.designParamsData.forEach(param => {\n                                            if (param.name === 'maxParkingRate') {\n                                                param.result = param.result.toFixed(2);\n                                            }\n                                        });\n                                        this.maxParkingRate = this.designParamsData.filter(x => x.name === 'maxParkingRate')[0].result;\n                                        if (this.selectedZone?.key && this.selectedZone?.value) {\n                                            this.designParamsData.unshift({\n                                                name: 'Zone',\n                                                result: zone.key + ' ' + zone.value\n                                            });\n                                        }\n                                        this.store.dispatch(SubdivisionActions.onCapParameters({cap: this.designParamsData}));\n                                        this.store.dispatch(SubdivisionActions.onCalculations());\n                                        this.designParamLoading = false;\n                                    });\n                                }\n                            }\n                        });\n                    }\n                });\n                this.onSiteChanged(site);\n            }\n        });\n    }\n\n    ngOnDestroy(): void {\n        // super.ngOnDestroy();\n        this.siteServiceSub.unsubscribe();\n        this.projectServiceSub.unsubscribe();\n        this.postcodeServiceSub.unsubscribe();\n        this.regionsServiceSub.unsubscribe();\n        this.unsubscribe$.next();\n        this.unsubscribe$.complete();\n    }\n\n    // Execute CAP\n    private refreshCap(projectId?: string): void {\n        if (this.landForm) {\n            const execParams: [string, any][] = [];\n            this.designParamsData = [];\n            this.selectedZone = this.landForm.get('zoneSelection').value;\n            if (this.selectedZone?.key) {\n                // Push variable:SiteZone for use in CAP\n                execParams.push(['SiteZone', this.selectedZone?.key]);\n                this.designParamLoading = true;\n                this.capApiService.getVariableFromCap(\n                    this.changeZoneLookup, projectId ?? '',\n                    execParams\n                ).subscribe(data => {\n                    this._designParams = undefined;\n                    this._designParams = data;\n                    this.designParamsData = data.results as AuditResultData[];\n                    this.designParamsData.forEach(param => {\n                        if (param.name === 'maxParkingRate') {\n                            param.result = param.result.toFixed(2);\n                        }\n                    });\n                    this.maxParkingRate = this.designParamsData.filter(x => x.name === 'maxParkingRate')[0]?.result;\n                    if (this.selectedZone?.key && this.selectedZone?.value) {\n                        this.designParamsData.unshift({\n                            name: 'Zone',\n                            result: this.selectedZone?.key + ' ' + this.selectedZone?.value\n                        });\n                    }\n                    this.store.dispatch(SubdivisionActions.onZone({zone: this.selectedZone}));\n                    this.store.dispatch(SubdivisionActions.onCapParameters({cap: this.designParamsData}));\n                    this.store.dispatch(SubdivisionActions.onCalculations());\n                    this.designParamLoading = false;\n                });\n            } else {\n                this._designParams = undefined;\n            }\n        }\n    }\n\n    protected get name(): string {\n        return 'LandDevelopmentComponent';\n    }\n\n    protected onProjectChanged(project?: AcabimProject): void {\n    }\n\n    protected onSiteChanged(site?: AcabimSite | null): void {\n        this.currentParcel = undefined;\n        this.currentBuildingData = undefined;\n        this.currentTopoData = undefined;\n        if (site) {\n            this.mapConfig = {\n                zoom: 16,\n                centerLongitude: site.longitude,\n                centerLatitude: site.latitude\n            };\n            this.currentLocation = new LocationInfo(site.latitude, site.longitude);\n            this.loadingParcel = true;\n            this.loadingBuildingData = true;\n            this.loadingTopoData = true;\n            this.landApiService.getPropertyParcelData(this.currentLocation).subscribe(data => {\n                this.currentParcel = data;\n                this.siteArea = data.calcArea51571;\n                this.store.dispatch(SubdivisionActions.onLandInformation({landInfo: data}));\n                this.loadingParcel = false;\n            });\n            this.landApiService.getBuildingInfo(this.currentLocation).subscribe(data => {\n                this.currentBuildingData = data;\n                this.store.dispatch(SubdivisionActions.onLandBuildingInfo({landBuildingInfo: data}));\n                this.loadingBuildingData = false;\n            });\n            this.landApiService.getTopoInfo(this.currentLocation).subscribe(data => {\n                this.currentTopoData = data;\n                this.store.dispatch(SubdivisionActions.onLandTopoInfo({landTopoInfo: data}));\n                this.loadingTopoData = false;\n            });\n\n            // this.landApiService.getPathCoordinates(new LocationInfo(site.latitude, site.longitude))\n            //     .subscribe(val => {\n            //         this.coords = val;\n            //     });\n        }\n    }\n\n    public getDevelopmentPlanningReport(): void {\n        if (this.selectedProject && this.selectedZone) {\n            this.pendingReport = true;\n            this.reportApiService.getReport('DevelopmentPlanningReport', {\n                projectId: this.projectApiService.selectedProjectId,\n                planningZone: this.selectedZone?.value\n            }).subscribe(blob => ReportService.savePdfFile(blob, `DevelopmentPlanningReport_${this.projectApiService.selectedProject?.name}`), error => {\n                this.pendingReport = false;\n                console.error(error);\n            }, () => {\n                this.pendingReport = false;\n            });\n        } else {\n            this.messageService.clear();\n            this.messageService.add({\n                severity: 'error',\n                summary: 'Please select project and zone to generate report'\n            });\n        }\n    }\n\n    changeTabEvent($event: string): void {\n        if (!this.selectedProject && $event === 'tab_02') {\n        }\n    }\n\n    changeZone(): void {\n        this.refreshCap(this.selectedProject?.id);\n        if (this.landForm) {\n            const zone = this.landForm.get('zoneSelection').value;\n            this.store.dispatch(SubdivisionActions.onZone({zone}));\n        }\n    }\n\n    updateSelectedSites($event: AcabimSite[]): void {\n        this._selectedSites = [...$event];\n    }\n\n    setZone($event: SubDivisionCalculationZone | undefined): void {\n        if (typeof $event !== 'undefined') {\n            this._selectedZone = $event;\n            this.landForm.get('zoneSelection').setValue(this._selectedZone);\n            this.store.dispatch(SubdivisionActions.onZone({zone: this.selectedZone}));\n            this.store.dispatch(SubdivisionActions.onCalculations());\n            this.refreshCap(this.currentId);\n        } else {\n            this.selectedZone = null;\n            this.landForm.get('zoneSelection').setValue(null);\n            this.store.dispatch(SubdivisionActions.onZone({zone: null}));\n        }\n    }\n    setSites($event: AcabimSite[] | undefined): void {\n        if (typeof $event !== 'undefined') {\n            this._initiallySelectedSites = $event;\n            this._selectedSites = $event;\n        } else {\n            this._initiallySelectedSites = [];\n        }\n    }\n    // Display zones depending on selected region\n    displayZonesSelection(value: any | null = null) {\n        this.hideZone = false;\n        const region = this.landForm.get('selectedRegion')?.value.key ?? this.selectedRegion?.key;\n        this.handleRegionDetails(region);\n        this.landForm.get('zoneSelection')?.setValue(null);\n        this.store.dispatch(SubdivisionActions.onZone({zone: null}));\n        this.store.dispatch(SubdivisionActions.onRegion({region: value?.key ?? null}));\n    }\n\n    handleRegionDetails(regionKey: string): void {\n        switch (regionKey) {\n            case 'AUK': {\n                this.planningZones = this.aupZones;\n                this.changeZoneLookup = 'LookUpAUP';\n                break;\n            }\n            case 'BOP': {\n                this.planningZones = this.bayOfPlentyZones;\n                this.changeZoneLookup = 'LookUpBOP';\n                break;\n            }\n            case 'CAN': {\n                this.planningZones = this.canterburyZones;\n                this.changeZoneLookup = 'LookUpCanterburyPlan';\n                break;\n            }\n            case 'GIS': {\n                this.planningZones = this.gisborneZones;\n                this.changeZoneLookup = 'LookUpGisbornePlan';\n                break;\n            }\n            case 'HKB': {\n                this.planningZones = this.hawkesBayZones;\n                this.changeZoneLookup = 'LookUpHawkesBayPlan';\n                break;\n            }\n            case 'MWT': {\n                this.planningZones = this.manawatuWanganuiZones;\n                this.changeZoneLookup = 'LookUpManawatuWanganuiPlan';\n                break;\n            }\n            case 'MBH': {\n                this.planningZones = this.marlboroughZones;\n                this.changeZoneLookup = 'LookUpMarlboroughPlan';\n                break;\n            }\n            case 'NTL': {\n                this.planningZones = this.northlandZones;\n                this.changeZoneLookup = 'LookUpNorthlandPlan';\n                break;\n            }\n            case 'OTA': {\n                this.planningZones = this.otagoZones;\n                this.changeZoneLookup = 'LookUpOtagoPlan';\n                break;\n            }\n            case 'RPH': {\n                this.planningZones = this.ruapehuZones;\n                this.changeZoneLookup = 'LookUpRuapehuPlan';\n                break;\n            }\n            case 'SWK': {\n                this.planningZones = this.southWaikatoZones;\n                this.changeZoneLookup = 'LookUpSouthWaikatoPlan';\n                break;\n            }\n            case 'TKI': {\n                this.planningZones = this.taranakiZones;\n                this.changeZoneLookup = 'LookUpTaranakiPlan';\n                break;\n            }\n            case 'TRG': {\n                this.planningZones = this.taurangaZones;\n                this.changeZoneLookup = 'LookUpTaurangaPlan';\n                break;\n            }\n            case 'WGN': {\n                this.planningZones = this.wellingtonZones;\n                this.changeZoneLookup = 'LookUpWellingtonPlan';\n                break;\n            }\n            case 'WKO': {\n                this.planningZones = this.waikatoZones;\n                this.changeZoneLookup = 'LookUpWaikatoPlan';\n                break;\n            }\n            case 'WTC': {\n                this.planningZones = this.westCoastZones;\n                this.changeZoneLookup = 'LookUpWestCoastPlan';\n                break;\n            }\n            default: {\n                this.planningZones = [];\n                this.changeZoneLookup = '';\n            }\n        }\n    }\n}\n","<div class=\"cas-wrapper\">\n<!--    <div class=\"p-col-6\">-->\n<!--        <acabim-card [cardContent]=\"mapView\" cardHeading=\"Main Site\" [isCollapsible]=\"true\"-->\n<!--                     [isCollapsed]=\"false\"></acabim-card>-->\n<!--    </div>-->\n\n        <acabim-card\n            [cardContent]=\"map\"\n            class=\"_t-zoning-card\"\n            cardHeading=\"Selected Site(s) and Zoning\"\n            [isCollapsible]=\"true\"\n            [hasHelpButton]=\"true\"\n            helpAudio=\"\"\n            helpMessage=\"Specify the region and the relevant planning zone to work with. You may save it with the project for subsequent analysis.\"\n            [extLinkUrl] = \"'https://cas.net.nz/acaland'\"\n            [linkText]=\"'ACALand Video Guide'\"\n            [isCollapsed]=\"isZoningCardCollapsed\"></acabim-card>\n        <acabim-card\n            [cardContent]=\"calculation\"\n            class=\"_t-subdivision-card\"\n            cardHeading=\"Subdivision Calculations\"\n            [isCollapsible]=\"true\"\n            [isCollapsed]=\"false\"\n            [hasHelpButton]=\"true\"\n            helpMessage=\"Specify the building size and number of storeys, as well as financial details, to perform a cost-benefit analysis of the project. Some parameters are calculated based on planning rules relevant to the selected site(s). The analysis outcome may be saved with the project for subsequent analyses in ACAPlan.\"\n            helpAudio=\"acaland/SpecifyAFewPertinent.mp3\"\n            [extLinkUrl] = \"'https://cas.net.nz/acaland'\"\n            [linkText]=\"'ACALand Video Guide'\"\n        ></acabim-card>\n\n        <acabim-card-with-nav\n            class=\"_t-designParams-card\"\n            tab1Title=\"LINZ data\"\n            [tab1Content]=\"linzView\"\n            tab2Title=\"Compliance Parameters\"\n            [tab2Content]=\"designParams\"\n            tab3Title=\"Calculation Details\"\n            [tab3Content]=\"calculationParams\"\n            [hasHelpButton]=\"true\"\n            [helpMessage]=\"'Here you will find compliance parameters for the selected site.'\"\n            (changeTab)=\"changeTabEvent($event)\"></acabim-card-with-nav>\n\n    <br/>\n\n    <!--\n    <div *ngIf=\"!pendingReport; else loadingView\">\n        <button class=\"cas-button\" (click)=\"getDevelopmentPlanningReport()\">Planning Report</button>\n    </div>\n    !-->\n</div>\n\n<ng-template #map>\n    <form [formGroup]=\"landForm\">\n        <div class=\"cas-flex-row\">\n        <acabim-form-block class=\"col-md-5\" labelWidth=\"11\" [labelAlign]=\"'right'\" [shortFields]=\"true\" [colonize]=\"true\">\n            <acabim-form-input-wrapper>\n                <acabim-form-input-label>Region</acabim-form-input-label>\n                <acabim-form-input-content>\n                    <p-dropdown\n                        appendTo=\"body\"\n                        formControlName=\"selectedRegion\"\n                        [options]=\"nzPlanningRegions\"\n                        optionLabel=\"value\"\n                        filter=\"true\"\n                        (onChange)=\"displayZonesSelection($event)\">\n                    </p-dropdown>\n                </acabim-form-input-content>\n            </acabim-form-input-wrapper>\n        </acabim-form-block>\n            <acabim-form-block class=\"col-md-7\" labelWidth=\"11\" [labelAlign]=\"'right'\" [shortFields]=\"true\" [colonize]=\"true\">\n            <acabim-form-input-wrapper>\n                <acabim-form-input-label>Planning zone</acabim-form-input-label>\n                <acabim-form-input-content>\n                    <!-- AUP Zones !-->\n                    <p-dropdown\n                        appendTo=\"body\"\n                        formControlName=\"zoneSelection\"\n                        [options]=\"planningZones\"\n                        optionLabel=\"value\"\n                        filter=\"true\"\n                        (onChange)=\"changeZone()\"></p-dropdown>\n                </acabim-form-input-content>\n            </acabim-form-input-wrapper>\n        </acabim-form-block>\n\n        </div>\n    </form>\n     <acaland-site-subdivision-map [mapConfig]=\"mapConfig\" [site]=\"selectedSite\"></acaland-site-subdivision-map>\n</ng-template>\n\n<ng-template #calculation>\n    <div class=\"cas-flex-row\">\n        <div class=\"p-col-12\">\n            <acabim-card\n                [cardContent]=\"siteSelection\"\n                cardHeading=\"Site amalgamation\"\n                [isCollapsible]=\"true\"\n                [isCollapsed]=\"true\"\n                [hasHelpButton]=\"true\"\n                [helpMessage]=\"'Add or remove adjoining land parcels from the site for a combined development exercise.'\">\n            </acabim-card>\n        </div>\n        <div class=\"p-col-12\">\n            <acaland-subdivision-calculation *ngIf=\"selectedProject else noProject\"\n                [siteOverride]=\"_initiallySelectedSites\"\n                [siteAndProject]=\"siteAndProject\"\n                [loading]=\"designParamLoading\"\n                (zoneRetrieved)=\"setZone($event)\"\n                (sitesRetrieved)=\"setSites($event)\">\n            </acaland-subdivision-calculation>\n        </div>\n    </div>\n</ng-template>\n\n<ng-template #linzView>\n    <acabim-card [cardContent]=\"property\" cardHeading=\"Property & Parcel Data\" [isCollapsible]=\"true\"\n                 [isCollapsed]=\"true\"></acabim-card>\n    <acabim-card [cardContent]=\"topo\" cardHeading=\"Topo\" [isCollapsible]=\"true\"\n                 [isCollapsed]=\"true\"></acabim-card>\n    <acabim-card [cardContent]=\"building\" cardHeading=\"Building\" [isCollapsible]=\"true\"\n                 [isCollapsed]=\"true\"></acabim-card>\n</ng-template>\n\n<ng-template #property>\n    <acaland-property-parcel-data-viewer [loading]=\"loadingParcel\"></acaland-property-parcel-data-viewer>\n</ng-template>\n\n<ng-template #topo>\n    <acaland-topo-data-viewer [loading]=\"loadingTopoData\"></acaland-topo-data-viewer>\n</ng-template>\n\n<ng-template #building>\n    <acaland-building-data-viewer [loading]=\"loadingBuildingData\"></acaland-building-data-viewer>\n</ng-template>\n\n<ng-template #designParams>\n    <acaland-design-params-viewer [loading]=\"designParamLoading\"></acaland-design-params-viewer>\n</ng-template>\n\n<ng-template #calculationParams>\n    <ng-container *ngIf=\"calculations\">\n        <div class=\"cas-flex-row\">\n            <div class=\"calc-info cas-pad-2\">\n                <acabim-data-display\n                    [dataMap]=\"lotNumberDataPayload\"\n                    labelWidth=\"14rem\"\n                    [atFoot]=\"false\"\n                    [toggle]=\"true\"\n                    [title]=\"'Sub-division calculation data'\"\n                    [copy]=\"true\"></acabim-data-display>\n            </div>\n            <div class=\"calc-info cas-pad-2\">\n                <acabim-data-display\n                    [dataMap]=\"financeDataPayload\"\n                    labelWidth=\"14rem\"\n                    [atFoot]=\"false\"\n                    [toggle]=\"true\"\n                    [title]=\"'Finance calculation data'\"\n                    [copy]=\"true\"></acabim-data-display>\n            </div>\n        </div>\n        <div class=\"cas-flex-row calc-info cas-pad-2\">\n            <acabim-data-display\n                [dataMap]=\"calculationDataPayload\"\n                labelWidth=\"14rem\"\n                [atFoot]=\"false\"\n                [title]=\"'All data'\"\n                [toggle]=\"true\"\n                [copy]=\"true\"></acabim-data-display>\n        </div>\n    </ng-container>\n</ng-template>\n\n<ng-template #noProject>\n    <div class=\"cas-error\">Please select a site and project to work with.</div>\n</ng-template>\n\n<ng-template #loadingView>\n    <acabim-loading-view></acabim-loading-view>\n</ng-template>\n\n<ng-template #siteSelection>\n    <acaland-site-adjoin\n        [initialSites]=\"_initiallySelectedSites\"\n        (returnedSites)=\"updateSelectedSites($event)\">\n    </acaland-site-adjoin>\n</ng-template>\n\n<p-toast position=\"center\"></p-toast>\n","import {Component, ElementRef, Input, OnInit, ViewChild} from '@angular/core';\nimport {faSearch, faSyncAlt} from '@fortawesome/free-solid-svg-icons';\n// @ts-ignore\nimport {polygon} from 'polygon-tools';\n\ninterface CasLineType {\n    x?: number;\n    y?: number;\n    z?: number;\n    x1?: number;\n    y1?: number;\n    z1?: number;\n    x2?: number;\n    y2?: number;\n    z2?: number;\n}\n\ninterface LineFixType {\n    result_array: number[][];\n    delete_units: number[][];\n    found_horizontal_line: CasLineType[];\n}\n\n@Component({\n    selector: 'acaland-polygon',\n    templateUrl: './polygon.component.html',\n    styleUrls: ['./polygon.component.scss']\n})\nexport class PolygonComponent implements OnInit {\n    constructor() { }\n    faSearch = faSearch;\n    faRotate = faSyncAlt;\n    data: any;\n    @ViewChild('canvas', { static: true })\n    canvas: ElementRef<HTMLCanvasElement> | undefined = undefined;\n    ctx: CanvasRenderingContext2D | null = null;\n    private width = 0;\n    private height = 0;\n    foundVerticalLine: CasLineType[] = [];\n    foundHorizonalLine: CasLineType[] = [];\n    deleteUnits: number[][] = [];\n    userInput = '';\n    tolerance = '0';\n    W1 = '';\n    L1 = '';\n    validPoints: number[][][] = [];\n    // percentage: string = '50';\n\n    value = 50;\n\n\n    inputArr: string[] = [];\n    pruned: any[] = [];\n    inputVectors: any[] = [];\n\n    maxX = 0;\n    maxY = 0;\n    minX = 0;\n    minY = 0;\n    deltaX = 0;\n    deltaY = 0;\n    widthRatio = 0;\n    heightRatio = 0;\n    centreX = 0;\n    centreY = 0;\n    translateX = 0;\n    translateY = 0;\n\n\n    @Input() childMessage = '';\n\n    havePointInMiddle = true;\n\n    havePointInUnitMiddle = true;\n    ngOnInit() {\n        // this.GetAngleABC(174.7568317,-36.84322855,174.75674515,-36.8434408333,174.7572322333,-36.8435691833)\n    }\n\n\n    process_input() {\n        this.userInput = '';\n        console.log(this.childMessage);\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.childMessage.length; i++) {\n            const x = parseFloat(this.childMessage[i][0]);\n            const y = parseFloat(this.childMessage[i][1]);\n            let newinput = x.toString();\n            this.userInput = this.userInput + newinput;\n            this.userInput = this.userInput + ',';\n            newinput = y.toString();\n            this.userInput = this.userInput + newinput;\n            this.userInput = this.userInput + ',';\n        }\n        this.inputArr = this.userInput.split(',');\n        this.inputArr.pop();\n        this.pruned = [];\n        // this.inputVectors = [];\n        for (let i = 0; i < this.inputArr.length; i = i + 2) {\n            const inputVector = { x: '', y: '' , z: ''};\n            inputVector.x = this.inputArr[i];\n            inputVector.y = this.inputArr[i + 1];\n            inputVector.z = '0';\n            this.inputVectors.push(inputVector);\n        }\n        // cut unnecessary points\n        this.pruned = this.prune();\n        this.cutInLine();\n    }\n\n    mbr_calc(){\n        let minArea = 1.7976931348623157E+10308;\n        // let rotateAngle = 0;\n        let finalRotateVectors: any[] = [];\n        let finalminx = 0;\n        let finalmaxx = 0;\n        let finalminy = 0;\n        let finalmaxy = 0;\n        for (let i = 1; i < 360; i++){\n            const newPoints = [];\n            let xArray: number[] = [];\n            let yArray: number[] = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let j = 0; j < this.pruned.length; j++) {\n                xArray.push(this.pruned[j].x);\n                yArray.push(this.pruned[j].y);\n            }\n            let minX = Math.min(...xArray);\n            let maxX = Math.max(...xArray);\n            let minY = Math.min(...yArray);\n            let maxY = Math.max(...yArray);\n            let deltaX = (maxX - minX);\n            let deltaY = (maxY - minY);\n            // tslint:disable-next-line:prefer-for-of\n            for (let k = 0; k < this.pruned.length; k++) {\n                const newVector = { x: 0, y: 0, z: 0 };\n                const newArray = this.rotate(minX + (deltaX / 2), minY + (deltaY / 2), this.pruned[k].x, this.pruned[k].y, i);\n                newVector.x = newArray[0];\n\n                newVector.y = newArray[1];\n\n                newVector.z = this.pruned[k].z;\n\n                newPoints.push(newVector);\n            }\n            xArray = [];\n            yArray = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let l = 0; l < newPoints.length; l++) {\n                xArray.push(Number(newPoints[l].x));\n                yArray.push(Number(newPoints[l].y));\n            }\n            minX = Math.min(...xArray);\n            maxX = Math.max(...xArray);\n            minY = Math.min(...yArray);\n            maxY = Math.max(...yArray);\n            deltaX = (maxX - minX);\n            deltaY = (maxY - minY);\n            if (deltaX * deltaY < minArea){\n                minArea = deltaX * deltaY;\n                // rotateAngle = i;\n                finalRotateVectors = newPoints;\n                finalminx = minX;\n                finalmaxx = maxX;\n                finalminy = minY;\n                finalmaxy = maxY;\n            }\n\n        }\n        // display bounding box\n        this.pruned = finalRotateVectors;\n        this.maxX = finalmaxx;\n        this.maxY = finalmaxy;\n        this.minX = finalminx;\n        this.minY = finalminy;\n        this.deltaX = (this.maxX - this.minX);\n        this.deltaY = (this.maxY - this.minY);\n    }\n\n    generate_units_from_mbr(){\n        const twoDPoints = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.pruned.length; i++) {\n            twoDPoints.push([parseFloat(this.pruned[i].x), parseFloat(this.pruned[i].y)]);\n        }\n        twoDPoints.pop();\n        const POLYGON = twoDPoints;\n        const widthUnits = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = this.minX; i <= this.maxX; i = i + parseFloat(this.W1)) {\n            widthUnits.push(String(i));\n        }\n        const widthIntervalCount = widthUnits.length - 1;\n        if (parseFloat(widthUnits[widthUnits.length - 1]) !== this.maxX) {\n            widthUnits.push(String(this.maxX));\n        }\n        const heightUnits = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = this.minY; i <= this.maxY; i = i + parseFloat(this.L1)) {\n            heightUnits.push(String(i));\n        }\n        const heightIntervalCount = heightUnits.length - 1;\n        if (parseFloat(heightUnits[heightUnits.length - 1]) !== this.maxY) {\n            heightUnits.push(String(this.maxY));\n        }\n        const totalNumberOfUnits = widthIntervalCount * heightIntervalCount;\n\n        // compare the inversed number of complete units and the original number of complete units, choose the maximum\n        const inversedWidthUnits = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = this.minX; i <= this.maxX; i = i + parseFloat(this.L1)) {\n            inversedWidthUnits.push(String(i));\n        }\n\n        const inversedWidthIntervalCount = inversedWidthUnits.length - 1;\n        if (parseFloat(inversedWidthUnits[inversedWidthUnits.length - 1]) !== this.maxX) {\n            inversedWidthUnits.push(String(this.maxX));\n        }\n\n        const inversedHeightUnits = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = this.minY; i <= this.maxY; i = i + parseFloat(this.W1)) {\n            inversedHeightUnits.push(String(i));\n        }\n        const inversedHeightIntervalCount = inversedHeightUnits.length - 1;\n\n        if (parseFloat(inversedHeightUnits[inversedHeightUnits.length - 1]) < this.maxY) {\n            inversedHeightUnits.push(String(this.maxY));\n        }\n\n        const totalNumberOfUnitsInverse = inversedWidthIntervalCount * inversedHeightIntervalCount;\n\n        let finalwidthUnits = [];\n        let finalheightUnits = [];\n        if (totalNumberOfUnitsInverse > totalNumberOfUnits) {\n            let temp;\n            temp = this.W1;\n            this.W1 = this.L1;\n            this.L1 = temp;\n            finalwidthUnits = widthUnits;\n            finalheightUnits = heightUnits;\n        }\n        else {\n            finalwidthUnits = inversedWidthUnits;\n            finalheightUnits = inversedHeightUnits;\n        }\n        return [finalwidthUnits, finalheightUnits, POLYGON];\n    }\n\n    get_unit_coords(finalwidthUnits: string[], finalheightUnits: string[], POLYGON: string[] | number[][]): number[][][]{\n        let validPoints: number[][][] = [];\n        let holes = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i <= finalwidthUnits.length - 2; i++) {\n            for (let j = 0; j <= finalheightUnits.length - 2; j++) {\n                holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j])]);\n                holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j])]);\n                holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j + 1])]);\n                holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j + 1])]);\n                const HOLE = holes;\n                const triangles: string[][][] = polygon.intersection(POLYGON, HOLE);\n                const paths: string[][] = triangles.map(triangle => {\n                    return triangle.reduce((p, pt) => {\n                        return p.concat(pt.map(p2 => p2));\n                    }, []);\n                });\n                if (paths.length !== 0) {\n                    const newPath: number[] = [];\n                    paths[0].forEach(path => {\n                        const pathNum: number = parseFloat(path);\n                        newPath.push(pathNum);\n                    });\n                    validPoints.push([newPath]);\n\n                }\n                holes = [];\n            }\n        }\n        // add incomplete units to adjancent unit\n        validPoints = this.trim(validPoints);\n\n        return validPoints;\n    }\n\n    Subdivide() {\n        // process user input\n        this.process_input();\n        console.log(this.pruned);\n\n\n        // dissplay mbr\n        this.mbr_calc();\n        console.log(this.pruned);\n\n        // get units for bounding box\n        const finalUnits: (string[] | number[][])[] = this.generate_units_from_mbr();\n        console.log(finalUnits);\n        const finalwidthUnits: string[] = this._handleMbrUnits(finalUnits[0]);\n        const finalheightUnits: string[] = this._handleMbrUnits(finalUnits[1]);\n        const POLYGON: string[] = this._handleMbrUnits(finalUnits[2]);\n        // get the units inside the polygon, cut if half outside\n        const validPoints: number[][][] = this.get_unit_coords(finalwidthUnits, finalheightUnits, POLYGON);\n        this.validPoints = validPoints;\n        console.log(this.validPoints);\n        this.plot_Subdivide();\n    }\n\n    _handleMbrUnits(units: (string[] | number[][])): string[] {\n        const result = [];\n        for (const item of units) {\n            if (typeof item === 'string') {\n                result.push(item);\n            } else {\n                result.push(item.toString());\n            }\n        }\n        return result;\n    }\n    calc_plot_params(){\n        if (typeof this.canvas !== 'undefined') {\n            this.ctx = this.canvas.nativeElement.getContext('2d');\n            if (this.ctx !== null) {\n                this.ctx.canvas.width = window.innerWidth;\n                this.ctx.canvas.height = window.innerHeight / 2;\n                this.width = this.ctx.canvas.width / 2;\n                this.height = this.ctx.canvas.height / 2;\n                let widthRatio = this.ctx.canvas.width / (this.deltaX);\n                let heightRatio = this.ctx.canvas.height / (this.deltaY);\n                this.widthRatio = widthRatio;\n                this.heightRatio = heightRatio;\n                if (heightRatio <= widthRatio) {\n                    widthRatio = heightRatio;\n                    this.widthRatio = widthRatio;\n                    this.heightRatio = heightRatio;\n                }\n                else {\n                    heightRatio = widthRatio;\n                    this.widthRatio = widthRatio;\n                    this.heightRatio = heightRatio;\n                }\n                this.centreX = (this.minX + (this.deltaX / 2)) * this.widthRatio;\n                this.centreY = (this.minY + (this.deltaY / 2)) * this.heightRatio;\n\n                this.translateX = this.width - this.centreX;\n                this.translateY = this.height - this.centreY;\n            }\n        }\n    }\n\n    plot_Subdivide()\n    {\n        // //draw the polygon\n        console.log(this.pruned);\n        this.calc_plot_params();\n        if (typeof this.canvas !== 'undefined') {\n            this.ctx = this.canvas.nativeElement.getContext('2d');\n            if (this.ctx !== null) {\n                this.ctx.beginPath();\n                this.ctx.strokeStyle = 'black';\n                this.ctx.arc(this.translateX + this.pruned[0].x * this.widthRatio, this.translateY + this.pruned[0].y * this.heightRatio, 5, 0, 2 * Math.PI, false);\n                this.ctx.moveTo(this.translateX + this.pruned[0].x * this.widthRatio, this.translateY + this.pruned[0].y * this.heightRatio);\n                this.ctx.fillStyle = '#d21d1d';\n                for (let i = 1; i < this.pruned.length; i++) {\n                    this.ctx.lineTo(this.pruned[i].x * this.widthRatio + this.translateX, this.pruned[i].y * this.heightRatio + this.translateY);\n                    this.ctx.fillRect(this.pruned[i].x * this.widthRatio + this.translateX, this.pruned[i].y * this.heightRatio + this.translateY, 2, 2);\n                }\n                this.ctx.stroke();\n                // draw bounding box\n                this.ctx.beginPath();\n                this.ctx.setLineDash([15, 5]);\n                this.ctx.strokeStyle = 'blue';\n                this.ctx.moveTo(this.translateX + this.minX * this.widthRatio, this.translateY + this.minY * this.heightRatio);\n                this.ctx.lineTo(this.minX * this.widthRatio + this.translateX, this.maxY * this.heightRatio + this.translateY);\n                this.ctx.lineTo(this.maxX * this.widthRatio + this.translateX, this.maxY * this.heightRatio + this.translateY);\n                this.ctx.lineTo(this.maxX * this.widthRatio + this.translateX, this.minY * this.heightRatio + this.translateY);\n                this.ctx.lineTo(this.minX * this.widthRatio + this.translateX, this.minY * this.heightRatio + this.translateY);\n                this.ctx.stroke();\n                // draw the units inside the polygon\n                this.ctx.beginPath();\n                this.ctx.setLineDash([10, 2]);\n                this.ctx.strokeStyle = 'green';\n                // tslint:disable-next-line:prefer-for-of\n                for (let i = 0; i < this.validPoints.length; i++) {\n                    if (this.validPoints[i] && this.validPoints[i].length > 0 && this.validPoints[i][0] && this.validPoints[i][0].length > 0) {\n                        // @ts-ignore\n                        this.ctx.moveTo(this.translateX + this.validPoints[i][0][0] * this.widthRatio, this.translateY + this.validPoints[i][0][1] * this.heightRatio);\n                        for (let j = 2; j < this.validPoints[i][0].length - 1; j = j + 2) {\n                            this.ctx.lineTo(this.validPoints[i][0][j] * this.widthRatio + this.translateX, this.validPoints[i][0][j + 1] * this.heightRatio + this.translateY);\n                        }\n                        // @ts-ignore\n                        this.ctx.lineTo(this.translateX + this.validPoints[i][0][0] * this.widthRatio, this.translateY + this.validPoints[i][0][1] * this.heightRatio);\n                    }\n                }\n                this.ctx.stroke();\n            }\n        }\n    }\n\n    Calculate() {\n        // get user input\n        this.userInput = '';\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.childMessage.length; i++) {\n            const x = parseFloat(this.childMessage[i][0]);\n            const y = parseFloat(this.childMessage[i][1]);\n            // const y = Math.sin(λ2-λ1) * Math.cos(φ2);\n            // const x = Math.cos(φ1)*Math.sin(φ2) - Math.sin(φ1)*Math.cos(φ2)*Math.cos(λ2-λ1);\n\n            let newinput = x.toString();\n            this.userInput = this.userInput + newinput;\n            this.userInput = this.userInput + ',';\n            newinput = y.toString();\n            this.userInput = this.userInput + newinput;\n            this.userInput = this.userInput + ',';\n            this.userInput = this.userInput + '1,';\n        }\n        this.inputArr = this.userInput.split(',');\n        this.inputArr.pop();\n        this.pruned = [];\n        this.inputVectors = [];\n        for (let i = 0; i < this.inputArr.length; i = i + 3) {\n            const inputVector = { x: '', y: '', z: '' };\n            inputVector.x = this.inputArr[i];\n            inputVector.y = this.inputArr[i + 1];\n            inputVector.z = this.inputArr[i + 2];\n            this.inputVectors.push(inputVector);\n        }\n\n        // cut unnecessary points\n        // this.pruned = this.inputVectors;\n        this.pruned = this.prune();\n        console.log('prune===');\n        console.log(this.pruned);\n        this.cutInLine();\n        console.log('cut===');\n        console.log(this.pruned);\n\n        // display edges\n        let edges = '';\n        const lengthArray = [];\n        for (let i = 0; i < this.pruned.length - 1; i++) {\n            const x2 = (this.pruned[i].x - this.pruned[i + 1].x) * (this.pruned[i].x - this.pruned[i + 1].x);\n            const y2 = (this.pruned[i].y - this.pruned[i + 1].y) * (this.pruned[i].y - this.pruned[i + 1].y);\n            const length = Math.sqrt(x2 + y2);\n            lengthArray.push(length);\n            edges = edges + 'line' + i + ': ' + length + '\\n';\n        }\n        const minimumLength = Math.min(...lengthArray);\n        edges = edges + '\\nMinimum Length = ' + minimumLength;\n\n        // display bounding box\n        let xArray = [];\n        let yArray = [];\n        let edgeArray = [];\n        let edgeLength = [];\n        for (let i = 0; i < this.pruned.length; i++) {\n            xArray.push(this.pruned[i].x);\n            yArray.push(this.pruned[i].y);\n            const edge = [];\n            if (i !== this.pruned.length - 1){\n                edge.push(this.pruned[i].x);\n                edge.push(this.pruned[i].y);\n                edge.push(this.pruned[i + 1].x);\n                edge.push(this.pruned[i + 1].y);\n                edgeArray.push(edge);\n                const length = Math.sqrt(\n                    (this.pruned[i].x - this.pruned[i + 1].x)\n                    * (this.pruned[i].x - this.pruned[i + 1].x)\n                    + (this.pruned[i].y - this.pruned[i + 1].y)\n                    * (this.pruned[i].y - this.pruned[i + 1].y)\n                );\n                edgeLength.push(length);\n            } else {\n                edge.push(this.pruned[i].x);\n                edge.push(this.pruned[i].y);\n                edge.push(this.pruned[0].x);\n                edge.push(this.pruned[0].y);\n                edgeArray.push(edge);\n                const length = Math.sqrt(\n                    (this.pruned[i].x - this.pruned[0].x)\n                    * (this.pruned[i].x - this.pruned[0].x)\n                    + (this.pruned[i].y - this.pruned[0].y)\n                    * (this.pruned[i].y - this.pruned[0].y)\n                );\n                edgeLength.push(length);\n            }\n        }\n        let rotateAngle = 0;\n        let maxEdgeLength =  Math.max(...edgeLength);\n        for (let i = 0; i < edgeLength.length; i++) {\n            if (edgeLength[i] === maxEdgeLength ){\n                rotateAngle =  this.GetAngleABC(edgeArray[i][2], edgeArray[i][3], edgeArray[i][0], edgeArray[i][1], Math.max(...xArray), Math.max(...yArray));\n\n            }\n        }\n\n        console.log('angle');\n        console.log(rotateAngle);\n        let minX = Math.min(...xArray);\n        let maxX = Math.max(...xArray);\n        let minY = Math.min(...yArray);\n        let maxY = Math.max(...yArray);\n        let z = this.pruned[0].z;\n        // let boundingCoordinate = String(minX) + ',' + String(minY) + ',' + String(z) + '\\n'\n        //     + String(minX) + ',' + String(maxY) + ',' + String(z) + '\\n' + String(maxX)\n        //     + ',' + String(maxY) + ',' + String(z) + '\\n' + String(maxX) + ',' + String(minY)\n        //     + ',' + String(z) + '\\n';\n\n        // get units for bounding box\n        let deltaX = (maxX - minX);\n        let deltaY = (maxY - minY);\n\n\n        let newPoints = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.pruned.length; i++) {\n            const newVector = { x: 0, y: 0, z: 0 };\n            const newArray = this.rotate(minX + (deltaX / 2), minY + (deltaY / 2), this.pruned[i].x, this.pruned[i].y, -rotateAngle);\n            newVector.x = newArray[0];\n\n            newVector.y = newArray[1];\n\n            newVector.z = this.pruned[i].z;\n\n            newPoints.push(newVector);\n        }\n\n        this.pruned = newPoints;\n\n        let twoDPoints = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.pruned.length; i++) {\n            twoDPoints.push([parseFloat(this.pruned[i].x), parseFloat(this.pruned[i].y)]);\n        }\n        twoDPoints.pop();\n        let POLYGON = twoDPoints;\n\n\n        xArray = [];\n        yArray = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.pruned.length; i++) {\n            xArray.push(this.pruned[i].x);\n            yArray.push(this.pruned[i].y);\n        }\n        minX = Math.min(...xArray);\n        maxX = Math.max(...xArray);\n        minY = Math.min(...yArray);\n        maxY = Math.max(...yArray);\n        z = this.pruned[0].z;\n        // boundingCoordinate = String(minX) + ',' + String(minY) + ',' + String(z)\n        //     + '\\n' + String(minX) + ',' + String(maxY) + ',' + String(z) + '\\n'\n        //     + String(maxX) + ',' + String(maxY) + ',' + String(z)\n        //     + '\\n' + String(maxX) + ',' + String(minY) + ',' + String(z) + '\\n';\n\n        // get units for bounding box\n        deltaX = (maxX - minX);\n        deltaY = (maxY - minY);\n\n        let widthUnits = [];\n        for (let i = minX; i <= maxX; i = i + parseFloat(this.W1)) {\n            widthUnits.push(String(i));\n        }\n        let widthIntervalCount = widthUnits.length - 1;\n        if (parseFloat(widthUnits[widthUnits.length - 1]) !== maxX) {\n            widthUnits.push(String(maxX));\n        }\n\n        let heightUnits = [];\n        for (let i = minY; i <= maxY; i = i + parseFloat(this.L1)) {\n            heightUnits.push(String(i));\n        }\n        let heightIntervalCount = heightUnits.length - 1;\n        if (parseFloat(heightUnits[heightUnits.length - 1]) !== maxY) {\n            heightUnits.push(String(maxY));\n        }\n        let totalNumberOfUnits = widthIntervalCount * heightIntervalCount;\n\n\n        // compare the inversed number of complete units and the original number of complete units, choose the maximum\n        let inversedWidthUnits = [];\n        for (let i = minX; i <= maxX; i = i + parseFloat(this.L1)) {\n            inversedWidthUnits.push(String(i));\n        }\n\n        let inversedWidthIntervalCount = inversedWidthUnits.length - 1;\n        if (parseFloat(inversedWidthUnits[inversedWidthUnits.length - 1]) !== maxX) {\n            inversedWidthUnits.push(String(maxX));\n        }\n\n        let inversedHeightUnits = [];\n        for (let i = minY; i <= maxY; i = i + parseFloat(this.W1)) {\n            inversedHeightUnits.push(String(i));\n        }\n        let inversedHeightIntervalCount = inversedHeightUnits.length - 1;\n\n        if (parseFloat(inversedHeightUnits[inversedHeightUnits.length - 1]) < maxY) {\n            inversedHeightUnits.push(String(maxY));\n        }\n\n        let totalNumberOfUnitsInverse = inversedWidthIntervalCount * inversedHeightIntervalCount;\n\n        let finalwidthUnits = [];\n        let finalheightUnits = [];\n\n\n        if (totalNumberOfUnitsInverse > totalNumberOfUnits) {\n            let temp;\n            temp = this.W1;\n            this.W1 = this.L1;\n            this.L1 = temp;\n            finalwidthUnits = widthUnits;\n            finalheightUnits = heightUnits;\n\n        }\n        else {\n            finalwidthUnits = inversedWidthUnits;\n            finalheightUnits = inversedHeightUnits;\n\n        }\n\n        // get the units inside the polygon, cut if half outside\n        let validPoints = [];\n        let holes = [];\n        for (let i = 0; i <= finalwidthUnits.length - 2; i++) {\n            for (let j = 0; j <= finalheightUnits.length - 2; j++) {\n                holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j])]);\n                holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j])]);\n                holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j + 1])]);\n                holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j + 1])]);\n                const HOLE = holes;\n                const triangles: string[][][] = polygon.intersection(POLYGON, HOLE);\n\n                const paths: string[][] = triangles.map(triangle => {\n                    return triangle.reduce((p, pt) => {\n                        return p.concat(pt.map(p2 => p2));\n                    }, []);\n                });\n                if (paths.length !== 0) {\n                    const newPath: number[] = [];\n                    paths[0].forEach(path => {\n                        const pathNum = parseFloat(path);\n                        newPath.push(pathNum);\n                    });\n                    validPoints.push([newPath]);\n\n                }\n                holes = [];\n\n            }\n        }\n\n        // add incomplete units to adjacent unit\n        validPoints = this.trim(validPoints);\n        const finalcount = validPoints.length;\n        let unitCoordinates = 'No. of effective units: ' + finalcount + '\\n\\n';\n        for (let i = 0; i <= validPoints.length - 1; i++) {\n            for (let j = 0; j < validPoints[i][0].length - 1; j = j + 2) {\n                unitCoordinates = unitCoordinates + validPoints[i][0][j] + ',' + validPoints[i][0][j + 1] + ',' + z + '\\n';\n            }\n            unitCoordinates = unitCoordinates + '\\n';\n        }\n\n\n\n\n        // inverse the polygon if the ratio of y/x is greater than 1.7\n        if (deltaY > deltaX * 1.7) {\n            newPoints = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < this.pruned.length; i++) {\n                const newVector = { x: 0, y: 0, z: 0 };\n                const newArray = this.rotate(minX + (deltaX / 2), minY + (deltaY / 2), this.pruned[i].x, this.pruned[i].y, 90);\n                newVector.x = newArray[0];\n\n                newVector.y = newArray[1];\n\n                newVector.z = this.pruned[i].z;\n\n                newPoints.push(newVector);\n            }\n\n            this.pruned = newPoints;\n\n        }\n\n        // get new reference points is inversed\n        if (deltaY > deltaX * 1.7) {\n            xArray = [];\n            yArray = [];\n            edgeArray = [];\n            edgeLength = [];\n            for (let i = 0; i < this.pruned.length; i++) {\n                xArray.push(this.pruned[i].x);\n                yArray.push(this.pruned[i].y);\n                const edge = [];\n                if (i !== this.pruned.length - 1){\n                    edge.push(this.pruned[i].x);\n                    edge.push(this.pruned[i].y);\n                    edge.push(this.pruned[i + 1].x);\n                    edge.push(this.pruned[i + 1].y);\n                    edgeArray.push(edge);\n                    const length = Math.sqrt(\n                        (this.pruned[i].x - this.pruned[i + 1].x)\n                        * (this.pruned[i].x - this.pruned[i + 1].x)\n                        + (this.pruned[i].y - this.pruned[i + 1].y)\n                        * (this.pruned[i].y - this.pruned[i + 1].y)\n                    );\n                    edgeLength.push(length);\n                }else{\n                    edge.push(this.pruned[i].x);\n                    edge.push(this.pruned[i].y);\n                    edge.push(this.pruned[0].x);\n                    edge.push(this.pruned[0].y);\n                    edgeArray.push(edge);\n                    const length = Math.sqrt(\n                        (this.pruned[i].x - this.pruned[0].x)\n                        * (this.pruned[i].x - this.pruned[0].x)\n                        + (this.pruned[i].y - this.pruned[0].y)\n                        * (this.pruned[i].y - this.pruned[0].y)\n                    );\n                    edgeLength.push(length);\n                }\n            }\n            rotateAngle = 0;\n            maxEdgeLength =  Math.max(...edgeLength);\n            for (let i = 0; i < edgeLength.length; i++) {\n                if (edgeLength[i] === maxEdgeLength ){\n                    rotateAngle =  this.GetAngleABC(edgeArray[i][2], edgeArray[i][3], edgeArray[i][0], edgeArray[i][1], Math.max(...xArray), Math.max(...yArray));\n\n                }\n            }\n            minX = Math.min(...xArray);\n            maxX = Math.max(...xArray);\n            minY = Math.min(...yArray);\n            maxY = Math.max(...yArray);\n\n\n            deltaX = (maxX - minX);\n            deltaY = (maxY - minY);\n\n            newPoints = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < this.pruned.length; i++) {\n                const newVector = { x: 0, y: 0, z: 0 };\n                const newArray = this.rotate(minX + (deltaX / 2), minY + (deltaY / 2), this.pruned[i].x, this.pruned[i].y, -rotateAngle);\n                newVector.x = newArray[0];\n\n                newVector.y = newArray[1];\n\n                newVector.z = this.pruned[i].z;\n\n                newPoints.push(newVector);\n            }\n\n            this.pruned = newPoints;\n\n\n            xArray = [];\n            yArray = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < this.pruned.length; i++) {\n                xArray.push(this.pruned[i].x);\n                yArray.push(this.pruned[i].y);\n            }\n            minX = Math.min(...xArray);\n            maxX = Math.max(...xArray);\n            minY = Math.min(...yArray);\n            maxY = Math.max(...yArray);\n            z = this.pruned[0].z;\n            // let boundingCoordinate = String(minX) + ',' + String(minY) + ',' + String(z) + '\\n'\n            //     + String(minX) + ',' + String(maxY) + ',' + String(z) + '\\n' + String(maxX)\n            //     + ',' + String(maxY) + ',' + String(z) + '\\n' + String(maxX) + ','\n            //     + String(minY) + ',' + String(z) + '\\n';\n\n            // get units for bounding box\n            deltaX = (maxX - minX);\n            deltaY = (maxY - minY);\n\n            widthUnits = [];\n            for (let i = minX; i <= maxX; i = i + parseFloat(this.W1)) {\n                widthUnits.push(String(i));\n            }\n            widthIntervalCount = widthUnits.length - 1;\n\n            if (parseFloat(widthUnits[widthUnits.length - 1]) !== maxX) {\n                widthUnits.push(String(maxX));\n            }\n\n\n            heightUnits = [];\n            for (let i = minY; i <= maxY; i = i + parseFloat(this.L1)) {\n                heightUnits.push(String(i));\n            }\n\n            heightIntervalCount = heightUnits.length - 1;\n\n            if (parseFloat(heightUnits[heightUnits.length - 1]) !== maxY) {\n\n                heightUnits.push(String(maxY));\n            }\n\n            totalNumberOfUnits = widthIntervalCount * heightIntervalCount;\n\n            inversedWidthUnits = [];\n            for (let i = minX; i <= maxX; i = i + parseFloat(this.L1)) {\n                inversedWidthUnits.push(String(i));\n            }\n\n            inversedWidthIntervalCount = inversedWidthUnits.length - 1;\n\n            if (parseFloat(inversedWidthUnits[inversedWidthUnits.length - 1]) !== maxX) {\n                inversedWidthUnits.splice(inversedWidthUnits.length - 1, 1);\n                inversedWidthUnits.push(String(maxX));\n            }\n\n\n            inversedHeightUnits = [];\n            for (let i = minY; i <= maxY; i = i + parseFloat(this.W1)) {\n                inversedHeightUnits.push(String(i));\n            }\n\n            inversedHeightIntervalCount = inversedHeightUnits.length - 1;\n\n            if (parseFloat(inversedHeightUnits[inversedHeightUnits.length - 1]) < maxY) {\n                inversedHeightUnits.splice(inversedHeightUnits.length - 1, 1);\n                inversedHeightUnits.push(String(maxY));\n            }\n\n\n\n            totalNumberOfUnitsInverse = inversedWidthIntervalCount * inversedHeightIntervalCount;\n\n            finalwidthUnits = [];\n            finalheightUnits = [];\n            if (totalNumberOfUnitsInverse > totalNumberOfUnits) {\n                let temp;\n                temp = this.W1;\n                this.W1 = this.L1;\n                this.L1 = temp;\n                finalwidthUnits = widthUnits;\n                finalheightUnits = heightUnits;\n            }\n            else {\n                finalwidthUnits = inversedWidthUnits;\n                finalheightUnits = inversedHeightUnits;\n            }\n            // const prunedpoints = '';\n            twoDPoints = [];\n            // tslint:disable-next-line:prefer-for-of\n            for (let i = 0; i < this.pruned.length; i++) {\n                twoDPoints.push([parseFloat(this.pruned[i].x), parseFloat(this.pruned[i].y)]);\n            }\n            twoDPoints.pop();\n            POLYGON = twoDPoints;\n            validPoints = [];\n            holes = [];\n            for (let i = 0; i <= finalwidthUnits.length - 2; i++) {\n                for (let j = 0; j <= finalheightUnits.length - 2; j++) {\n                    holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j])]);\n                    holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j])]);\n                    holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j + 1])]);\n                    holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j + 1])]);\n                    const HOLE = holes;\n                    const triangles: string[][][] = polygon.intersection(POLYGON, HOLE);\n                    const paths: string[][] = triangles.map(triangle => {\n                        return triangle.reduce((p, pt) => {\n                            return p.concat(pt.map(p2 => p2));\n                        }, []);\n                    });\n                    if (paths.length !== 0) {\n                        const newPath: number[] = [];\n                        paths[0].forEach(path => {\n                            const pathNum = parseFloat(path);\n                            newPath.push(pathNum);\n\n                        });\n\n                        validPoints.push([newPath]);\n\n                    }\n                    holes = [];\n\n                }\n            }\n            validPoints = this.trim(validPoints);\n\n        }\n\n        // draw the polygon\n        if (typeof this.canvas !== 'undefined') {\n            this.ctx = this.canvas.nativeElement.getContext('2d');\n            if (this.ctx  !== null) {\n                this.ctx.canvas.width = window.innerWidth;\n                this.ctx.canvas.height = window.innerHeight / 2;\n                this.width = this.ctx.canvas.width / 2;\n                this.height = this.ctx.canvas.height / 2;\n                let heightRatio = this.ctx.canvas.height / (deltaY );\n                let widthRatio = this.ctx.canvas.width / (deltaX );\n                if (heightRatio <= widthRatio) {\n                    widthRatio = heightRatio;\n                }\n                else {\n                    heightRatio = widthRatio;\n                }\n                const centreX = (minX + (deltaX / 2)) * widthRatio;\n                const centreY = (minY + (deltaY / 2)) * heightRatio;\n                const translateX = this.width - centreX;\n                const translateY = this.height - centreY;\n                this.ctx.beginPath();       // Start a new path\n                this.ctx.strokeStyle = 'black';\n                this.ctx.arc(translateX + this.pruned[0].x * widthRatio, translateY + this.pruned[0].y * heightRatio, 5, 0, 2 * Math.PI, false);\n                this.ctx.moveTo(translateX + this.pruned[0].x * widthRatio, translateY + this.pruned[0].y * heightRatio);\n                this.ctx.fillStyle = '#FF0000';\n                for (let i = 1; i < this.pruned.length; i++) {\n                    this.ctx.lineTo(this.pruned[i].x * widthRatio + translateX, this.pruned[i].y * heightRatio + translateY);\n                    this.ctx.fillRect(this.pruned[i].x * widthRatio + translateX, this.pruned[i].y * heightRatio + translateY, 2, 2);\n\n                }\n\n                this.ctx.stroke();\n\n                // draw bounding box\n                this.ctx.beginPath();\n                this.ctx.setLineDash([15, 5]);\n                this.ctx.strokeStyle = 'blue';\n                this.ctx.moveTo(translateX + minX * widthRatio, translateY + minY * heightRatio);\n                this.ctx.lineTo(minX * widthRatio + translateX, maxY * heightRatio + translateY);\n                this.ctx.lineTo(maxX * widthRatio + translateX, maxY * heightRatio + translateY);\n                this.ctx.lineTo(maxX * widthRatio + translateX, minY * heightRatio + translateY);\n                this.ctx.lineTo(minX * widthRatio + translateX, minY * heightRatio + translateY);\n                this.ctx.stroke();\n\n                // draw the units inside the polygon\n                this.ctx.beginPath();\n                this.ctx.setLineDash([10, 2]);\n                this.ctx.strokeStyle = 'green';\n                for (let i = 0; i <= validPoints.length - 1; i++) {\n                    this.ctx.moveTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n                    for (let j = 2; j < validPoints[i][0].length - 1; j = j + 2) {\n\n                        this.ctx.lineTo(validPoints[i][0][j] * widthRatio + translateX, validPoints[i][0][j + 1] * heightRatio + translateY);\n\n                    }\n                    this.ctx.lineTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n                }\n                this.ctx.stroke();\n            }\n        }\n    }\n\n    RotatePolygon(){\n        if (typeof this.canvas !== 'undefined') {\n            this.ctx = this.canvas.nativeElement.getContext('2d');\n            if (this.ctx !== null) {\n                this.ctx.clearRect(0, 0, this.canvas.nativeElement.width, this.canvas.nativeElement.height);\n                if (this.pruned.length === 0) {\n                    alert('no point found for polygon');\n                } else {\n                    // display bounding box\n                    let xArray = [];\n                    let yArray = [];\n                    const edgeArray = [];\n                    const edgeLength = [];\n                    for (let i = 0; i < this.pruned.length; i++) {\n                        xArray.push(this.pruned[i].x);\n                        yArray.push(this.pruned[i].y);\n                        const edge = [];\n                        if (i !== this.pruned.length - 1) {\n                            edge.push(this.pruned[i].x);\n                            edge.push(this.pruned[i].y);\n                            edge.push(this.pruned[i + 1].x);\n                            edge.push(this.pruned[i + 1].y);\n                            edgeArray.push(edge);\n                            const length = Math.sqrt((this.pruned[i].x - this.pruned[i + 1].x)\n                                * (this.pruned[i].x - this.pruned[i + 1].x) + (this.pruned[i].y - this.pruned[i + 1].y)\n                                * (this.pruned[i].y - this.pruned[i + 1].y));\n                            edgeLength.push(length);\n                        } else {\n                            edge.push(this.pruned[i].x);\n                            edge.push(this.pruned[i].y);\n                            edge.push(this.pruned[0].x);\n                            edge.push(this.pruned[0].y);\n                            edgeArray.push(edge);\n                            const length = Math.sqrt((this.pruned[i].x - this.pruned[0].x) * (this.pruned[i].x - this.pruned[0].x)\n                                + (this.pruned[i].y - this.pruned[0].y) * (this.pruned[i].y - this.pruned[0].y));\n                            edgeLength.push(length);\n                        }\n                    }\n                    let rotateAngle = 0;\n                    const maxEdgeLength = Math.max(...edgeLength);\n                    for (let i = 0; i < edgeLength.length; i++) {\n                        if (edgeLength[i] === maxEdgeLength) {\n                            rotateAngle = this.GetAngleABC(edgeArray[i][2], edgeArray[i][3], edgeArray[i][0], edgeArray[i][1], Math.max(...xArray), Math.max(...yArray));\n\n                        }\n                    }\n\n                    console.log('angle');\n                    console.log(rotateAngle);\n                    let minX = Math.min(...xArray);\n                    let maxX = Math.max(...xArray);\n                    let minY = Math.min(...yArray);\n                    let maxY = Math.max(...yArray);\n                    // let z = this.pruned[0].z;\n\n                    // get units for bounding box\n                    let deltaX = (maxX - minX);\n                    let deltaY = (maxY - minY);\n\n\n                    const newPoints = [];\n                    // tslint:disable-next-line:prefer-for-of\n                    for (let i = 0; i < this.pruned.length; i++) {\n                        const newVector = {x: 0, y: 0, z: 0};\n                        const newArray = this.rotate(minX + (deltaX / 2), minY + (deltaY / 2), this.pruned[i].x, this.pruned[i].y, 90);\n                        newVector.x = newArray[0];\n\n                        newVector.y = newArray[1];\n\n                        newVector.z = this.pruned[i].z;\n\n                        newPoints.push(newVector);\n                    }\n\n                    this.pruned = newPoints;\n\n                    const twoDPoints = [];\n                    // tslint:disable-next-line:prefer-for-of\n                    for (let i = 0; i < this.pruned.length; i++) {\n                        twoDPoints.push([parseFloat(this.pruned[i].x), parseFloat(this.pruned[i].y)]);\n                    }\n                    twoDPoints.pop();\n                    const POLYGON = twoDPoints;\n\n\n                    xArray = [];\n                    yArray = [];\n                    // tslint:disable-next-line:prefer-for-of\n                    for (let i = 0; i < this.pruned.length; i++) {\n                        xArray.push(this.pruned[i].x);\n                        yArray.push(this.pruned[i].y);\n                    }\n                    minX = Math.min(...xArray);\n                    maxX = Math.max(...xArray);\n                    minY = Math.min(...yArray);\n                    maxY = Math.max(...yArray);\n                    // let z = this.pruned[0].z;\n                    // const boundingCoordinate = String(minX) + ',' + String(minY) + ',' + String(z) + '\\n'\n                    //     + String(minX) + ',' + String(maxY) + ',' + String(z) + '\\n' + String(maxX) + ','\n                    //     + String(maxY) + ',' + String(z) + '\\n' + String(maxX) + ',' + String(minY) + ','\n                    //     + String(z) + '\\n';\n\n                    // get units for bounding box\n                    deltaX = (maxX - minX);\n                    deltaY = (maxY - minY);\n\n                    const widthUnits = [];\n                    for (let i = minX; i <= maxX; i = i + parseFloat(this.W1)) {\n                        widthUnits.push(String(i));\n                    }\n                    const widthIntervalCount = widthUnits.length - 1;\n                    if (parseFloat(widthUnits[widthUnits.length - 1]) !== maxX) {\n                        widthUnits.push(String(maxX));\n                    }\n\n                    const heightUnits = [];\n                    for (let i = minY; i <= maxY; i = i + parseFloat(this.L1)) {\n                        heightUnits.push(String(i));\n                    }\n                    const heightIntervalCount = heightUnits.length - 1;\n                    if (parseFloat(heightUnits[heightUnits.length - 1]) !== maxY) {\n                        heightUnits.push(String(maxY));\n                    }\n                    const totalNumberOfUnits = widthIntervalCount * heightIntervalCount;\n\n\n                    // compare the inversed number of complete units and the original number of complete units, choose the maximum\n                    const inversedWidthUnits = [];\n                    for (let i = minX; i <= maxX; i = i + parseFloat(this.L1)) {\n                        inversedWidthUnits.push(String(i));\n                    }\n\n                    const inversedWidthIntervalCount = inversedWidthUnits.length - 1;\n                    if (parseFloat(inversedWidthUnits[inversedWidthUnits.length - 1]) !== maxX) {\n                        inversedWidthUnits.push(String(maxX));\n                    }\n\n                    const inversedHeightUnits = [];\n                    for (let i = minY; i <= maxY; i = i + parseFloat(this.W1)) {\n                        inversedHeightUnits.push(String(i));\n                    }\n                    const inversedHeightIntervalCount = inversedHeightUnits.length - 1;\n\n                    if (parseFloat(inversedHeightUnits[inversedHeightUnits.length - 1]) < maxY) {\n                        inversedHeightUnits.push(String(maxY));\n                    }\n\n                    const totalNumberOfUnitsInverse = inversedWidthIntervalCount * inversedHeightIntervalCount;\n\n                    let finalwidthUnits = [];\n                    let finalheightUnits = [];\n\n\n                    if (totalNumberOfUnitsInverse > totalNumberOfUnits) {\n                        let temp;\n                        temp = this.W1;\n                        this.W1 = this.L1;\n                        this.L1 = temp;\n                        finalwidthUnits = widthUnits;\n                        finalheightUnits = heightUnits;\n\n                    } else {\n                        finalwidthUnits = inversedWidthUnits;\n                        finalheightUnits = inversedHeightUnits;\n\n                    }\n\n                    // get the units inside the polygon, cut if half outside\n                    let validPoints = [];\n                    let holes = [];\n                    for (let i = 0; i <= finalwidthUnits.length - 2; i++) {\n                        for (let j = 0; j <= finalheightUnits.length - 2; j++) {\n                            holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j])]);\n                            holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j])]);\n                            holes.push([parseFloat(finalwidthUnits[i + 1]), parseFloat(finalheightUnits[j + 1])]);\n                            holes.push([parseFloat(finalwidthUnits[i]), parseFloat(finalheightUnits[j + 1])]);\n                            const HOLE = holes;\n                            const triangles: string[][][] = polygon.intersection(POLYGON, HOLE);\n                            const paths: string[][] = triangles.map(triangle => {\n                                return triangle.reduce((p, pt) => {\n                                    return p.concat(pt.map(p2 => p2));\n                                }, []);\n                            });\n                            if (paths.length !== 0) {\n                                const newPath: number[] = [];\n                                paths[0].forEach(path => {\n                                    const pathNum = parseFloat(path);\n                                    newPath.push(pathNum);\n                                });\n                                validPoints.push([newPath]);\n\n                            }\n                            holes = [];\n\n                        }\n                    }\n\n                    // add incomplete units to adjancent unit\n                    validPoints = this.trim(validPoints);\n\n                    // draw the polygon\n                    if (typeof this.canvas !== 'undefined') {\n                        this.ctx = this.canvas.nativeElement.getContext('2d');\n                        if (this.ctx !== null) {\n                            this.ctx.canvas.width = window.innerWidth;\n                            this.ctx.canvas.height = window.innerHeight / 2;\n                            this.width = this.ctx.canvas.width / 2;\n                            this.height = this.ctx.canvas.height / 2;\n                            let heightRatio = this.ctx.canvas.height / (deltaY);\n                            let widthRatio = this.ctx.canvas.width / (deltaX);\n                            if (heightRatio <= widthRatio) {\n                                widthRatio = heightRatio;\n                            } else {\n                                heightRatio = widthRatio;\n                            }\n                            const centreX = (minX + (deltaX / 2)) * widthRatio;\n                            const centreY = (minY + (deltaY / 2)) * heightRatio;\n                            const translateX = this.width - centreX;\n                            const translateY = this.height - centreY;\n                            this.ctx.beginPath();       // Start a new path\n                            this.ctx.strokeStyle = 'black';\n                            this.ctx.arc(translateX + this.pruned[0].x * widthRatio, translateY + this.pruned[0].y * heightRatio, 5, 0, 2 * Math.PI, false);\n                            this.ctx.moveTo(translateX + this.pruned[0].x * widthRatio, translateY + this.pruned[0].y * heightRatio);\n                            this.ctx.fillStyle = '#FF0000';\n                            for (let i = 1; i < this.pruned.length; i++) {\n                                this.ctx.lineTo(this.pruned[i].x * widthRatio + translateX, this.pruned[i].y * heightRatio + translateY);\n                                this.ctx.fillRect(this.pruned[i].x * widthRatio + translateX, this.pruned[i].y * heightRatio + translateY, 2, 2);\n\n                            }\n\n                            this.ctx.stroke();\n\n                            // draw bounding box\n                            this.ctx.beginPath();\n                            this.ctx.setLineDash([15, 5]);\n                            this.ctx.strokeStyle = 'blue';\n                            this.ctx.moveTo(translateX + minX * widthRatio, translateY + minY * heightRatio);\n                            this.ctx.lineTo(minX * widthRatio + translateX, maxY * heightRatio + translateY);\n                            this.ctx.lineTo(maxX * widthRatio + translateX, maxY * heightRatio + translateY);\n                            this.ctx.lineTo(maxX * widthRatio + translateX, minY * heightRatio + translateY);\n                            this.ctx.lineTo(minX * widthRatio + translateX, minY * heightRatio + translateY);\n                            this.ctx.stroke();\n\n\n                            // draw the units inside the polygon\n                            this.ctx.beginPath();\n                            this.ctx.setLineDash([10, 2]);\n                            this.ctx.strokeStyle = 'green';\n                            for (let i = 0; i <= validPoints.length - 1; i++) {\n                                this.ctx.moveTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n                                for (let j = 2; j < validPoints[i][0].length - 1; j = j + 2) {\n\n                                    this.ctx.lineTo(validPoints[i][0][j] * widthRatio + translateX, validPoints[i][0][j + 1] * heightRatio + translateY);\n\n                                }\n                                this.ctx.lineTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n                            }\n                            this.ctx.stroke();\n                        }\n                    }\n\n\n                }\n            }\n        }\n    }\n    // cut the points where the distance of it to other points are closer than user input\n    prune() {\n        const prunedArray = [];\n        prunedArray.push(this.inputVectors[0]);\n        let referencePoint = this.inputVectors[0];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < this.inputVectors.length; i++) {\n            if (Math.abs(this.inputVectors[i].x - referencePoint.x) <= parseFloat(this.tolerance)\n                && Math.abs(this.inputVectors[i].y - referencePoint.y) <= parseFloat(this.tolerance)) {\n\n            }\n            else {\n                referencePoint = this.inputVectors[i];\n                prunedArray.push(this.inputVectors[i]);\n            }\n        }\n        return prunedArray;\n    }\n\n    // cut points if its in middle of one line or the angle of this point is less than 1 degree\n    cutInLine() {\n        const cut = [];\n        let referencePoint = this.pruned[0];\n        cut.push(this.pruned[0]);\n        this.havePointInMiddle = false;\n        for (let i = 0; i < this.pruned.length - 2; i++) {\n\n            if (this.pruned[i] === referencePoint) {\n                let slope1;\n                let slope2;\n                let angle1;\n                let angle2;\n                if (this.pruned[i + 1].x - this.pruned[i].x !== 0) {\n                    slope1 = (this.pruned[i + 1].y - this.pruned[i].y) / (this.pruned[i + 1].x - this.pruned[i].x);\n                }\n                else {\n                    slope1 = 'INF';\n                }\n\n                if (this.pruned[i + 2].x - this.pruned[i + 1].x !== 0) {\n                    slope2 = (this.pruned[i + 2].y - this.pruned[i + 1].y) / (this.pruned[i + 2].x - this.pruned[i + 1].x);\n                }\n                else {\n                    slope2 = 'INF';\n                }\n\n                if (slope1 !== 'INF' && (typeof slope1 !== 'string')) {\n                    angle1 = Math.atan(slope1) * 180 / Math.PI;\n                }\n                else {\n                    angle1 = 180;\n                }\n\n\n                if (slope2 !== 'INF' && (typeof slope2 !== 'string')) {\n                    angle2 = Math.atan(slope2) * 180 / Math.PI;\n                }\n                else {\n                    angle2 = 180;\n                }\n                if (slope2 === slope1 || (angle1 <= angle2 + 1 && angle1 >= angle2 - 1) || (angle2 <= angle1 + 1 && angle2 >= angle1 - 1)) {\n                    referencePoint = this.pruned[i + 2];\n                    cut.push(this.pruned[i + 2]);\n                    this.havePointInMiddle = true;\n                }\n                else {\n                    referencePoint = this.pruned[i + 1];\n                    cut.push(this.pruned[i + 1]);\n                }\n            }\n            if (i === this.pruned.length - 3) {\n                cut.push(this.pruned[i + 2]);\n            }\n        }\n        this.pruned = cut;\n        if (this.havePointInMiddle === true && this.pruned.length > 2) {\n            this.cutInLine();\n        }\n    }\n\n\n    cutInUnit(unit: any[]) {\n        const cut = [];\n        unit.push(unit[0]);\n        let referencePoint = unit[0];\n        cut.push(unit[0]);\n        this.havePointInUnitMiddle = false;\n        for (let i = 0; i < unit.length - 2; i++) {\n\n            if (unit[i] === referencePoint) {\n                let slope1;\n                let slope2;\n                let angle1;\n                let angle2;\n                if (unit[i + 1].x - unit[i].x !== 0) {\n                    slope1 = (unit[i + 1].y - unit[i].y) / (unit[i + 1].x - unit[i].x);\n                }\n                else {\n                    slope1 = 'INF';\n                }\n\n                if (unit[i + 2].x - unit[i + 1].x !== 0) {\n                    slope2 = (unit[i + 2].y - unit[i + 1].y) / (unit[i + 2].x - unit[i + 1].x);\n                }\n                else {\n                    slope2 = 'INF';\n                }\n\n                if (slope1 !== 'INF' && (typeof slope1 !== 'string')) {\n                    angle1 = Math.atan(slope1) * 180 / Math.PI;\n                }\n                else {\n                    angle1 = 180;\n                }\n\n\n                if (slope2 !== 'INF' && (typeof slope2 !== 'string')) {\n                    angle2 = Math.atan(slope2) * 180 / Math.PI;\n                }\n                else {\n                    angle2 = 180;\n                }\n                if (slope2 === slope1\n                        || (angle1 <= angle2 + 1 && angle1 >= angle2 - 1)\n                        || (angle2 <= angle1 + 1 && angle2 >= angle1 - 1)\n                        || ((unit[i + 1].x === unit[i].x)\n                        && (unit[i + 1].y === unit[i].y))) {\n                    referencePoint = unit[i + 2];\n                    cut.push(unit[i + 2]);\n                    this.havePointInUnitMiddle = true;\n                }\n                else {\n                    referencePoint = unit[i + 1];\n                    cut.push(unit[i + 1]);\n                }\n            }\n            if (i === unit.length - 3) {\n                cut.push(unit[i + 2]);\n            }\n        }\n        let slope1last;\n        let slope2last;\n        let angle1Last;\n        let angle2Last;\n        if (cut[cut.length - 2].x - cut[0].x !== 0) {\n            slope1last = (cut[cut.length - 2].y - cut[0].y) / (cut[cut.length - 2].x - cut[0].x);\n        }\n        else {\n            slope1last = 'INF';\n        }\n\n        if (cut[0].x - cut[1].x !== 0) {\n            slope2last = (cut[0].y - cut[1].y) / (cut[0].x - cut[1].x);\n        }\n        else {\n            slope2last = 'INF';\n        }\n\n        if (slope1last !== 'INF' && (typeof slope1last !== 'string')) {\n            angle1Last = Math.atan(slope1last) * 180 / Math.PI;\n        }\n        else {\n            angle1Last = 180;\n        }\n\n\n        if (slope2last !== 'INF' && (typeof slope2last !== 'string')) {\n            angle2Last = Math.atan(slope2last) * 180 / Math.PI;\n        }\n        else {\n            angle2Last = 180;\n        }\n\n        if (slope2last === slope1last\n                || (angle1Last <= angle2Last + 1\n                && angle1Last >= angle2Last - 1)\n                || (angle2Last <= angle1Last + 1\n                && angle2Last >= angle1Last - 1)\n                || ((cut[cut.length - 2].x === cut[0].x)\n                && (cut[cut.length - 2].y === cut[0].y))) {\n            cut.splice(0, 1);\n        }\n\n        // if (this.havePointInUnitMiddle == true && unit.length > 2) {\n        //   cut = this.cutInUnit(cut)\n        // }\n        cut.pop();\n\n        return cut;\n    }\n\n\n    rotate(cx: number, cy: number, x: number, y: number, angle: number) {\n        const radians = (Math.PI / 180) * angle;\n        const cos = Math.cos(radians);\n        const sin = Math.sin(radians);\n        const nx = (cos * (x - cx)) + (sin * (y - cy)) + cx;\n        const ny = (cos * (y - cy)) - (sin * (x - cx)) + cy;\n        return [nx, ny];\n    }\n\n\n\n    findInvalidUnitsX(allUnits: number[][][], inputX: string): LineFixType {\n        const resultArray: number[][] = [];\n        this.deleteUnits = [];\n        this.foundVerticalLine  = [];\n        // tslint:disable-next-line:prefer-for-of\n        for (let i = 0; i < allUnits.length; i++) {\n            const xArray: number[] = [];\n            const yArray: number[] = [];\n            for (let j = 0; j < allUnits[i][0].length - 1; j = j + 2) {\n                xArray.push(allUnits[i][0][j]);\n                yArray.push(allUnits[i][0][j + 1]);\n            }\n            const minX = Math.min(...xArray);\n            const maxX = Math.max(...xArray);\n\n            const deltaX = maxX - minX;\n\n            if (deltaX < parseFloat(inputX) / 100.00 * parseFloat(this.L1)) {\n\n                const find = this.addUnitY(allUnits[i], allUnits);\n                if (find) {\n                    const allUnitsSelected: number[][] = allUnits[i];\n                    resultArray.push(allUnitsSelected[0]);\n                }\n            }\n        }\n        return {\n            result_array: resultArray,\n            delete_units: this.deleteUnits,\n            found_horizontal_line: this.foundHorizonalLine\n        };\n    }\n\n    findInvalidUnitsY(allUnits: number[][][], inputY: string): LineFixType {\n        const resultArray = [];\n        this.deleteUnits = [];\n        this.foundHorizonalLine = [];\n        for (let i = 0; i <= allUnits.length - 1; i++) {\n            const xArray: number[] = [];\n            const yArray: number[] = [];\n            for (let j = 0; j < allUnits[i][0].length - 1; j = j + 2) {\n                xArray.push(allUnits[i][0][j]);\n                yArray.push(allUnits[i][0][j + 1]);\n            }\n            // const minX = Math.min(...xArray);\n            // const maxX = Math.max(...xArray);\n            const minY = Math.min(...yArray);\n            const maxY = Math.max(...yArray);\n\n\n            const deltaY = maxY - minY;\n\n            if (deltaY < parseFloat(inputY) / 100.00 * parseFloat(this.W1)) {\n\n\n                const find = this.addUnitX(allUnits[i], allUnits);\n                if (find === true) {\n\n                    resultArray.push(allUnits[i][0]);\n                }\n\n            }\n        }\n        return {\n            result_array: resultArray,\n            delete_units: this.deleteUnits,\n            found_horizontal_line: this.foundHorizonalLine\n        };\n\n    }\n\n\n\n    addUnitX(invalidUnit: number[][], allUnits: number[][][]) {\n        // var resultUnits = []\n        let find = false;\n        // let matchUnit = [];\n        const referenceXArray: number[] = [];\n        const referenceYArray: number[] = [];\n\n        const horizontalLines: CasLineType[] = [];\n\n        for (let j = 0; j < invalidUnit[0].length - 1; j = j + 2) {\n            referenceXArray.push(invalidUnit[0][j]);\n            referenceYArray.push(invalidUnit[0][j + 1]);\n        }\n        let horizontalLine = { x1: 0, y1: 0, x2: 0, y2: 0 };\n\n        for (let j = 0; j < referenceXArray.length - 1; j++) {\n            if (referenceYArray[j] === referenceYArray[j + 1]) {\n                horizontalLine = { x1: referenceXArray[j], y1: referenceYArray[j], x2: referenceXArray[j + 1], y2: referenceYArray[j + 1] };\n                horizontalLines.push(horizontalLine);\n            }\n        }\n\n        if (referenceYArray[referenceYArray.length - 1] === referenceYArray[0]) {\n            horizontalLine = { x1: referenceXArray[referenceYArray.length - 1], y1: referenceYArray[referenceYArray.length - 1], x2: referenceXArray[0], y2: referenceYArray[0] };\n            horizontalLines.push(horizontalLine);\n        }\n\n\n        for (let i = 0; i <= allUnits.length - 1; i++) {\n            const xArray: number[] = [];\n            const yArray: number[] = [];\n            // this.ctx.moveTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n            for (let j = 0; j < allUnits[i][0].length - 1; j = j + 2) {\n                xArray.push(allUnits[i][0][j]);\n                yArray.push(allUnits[i][0][j + 1]);\n            }\n\n            for (let j = 0; j < yArray.length - 1; j++) {\n                for (let k = 0; k <= horizontalLines.length - 1; k++) {\n                    if (((xArray[j] === horizontalLines[k].x1\n                        && yArray[j] === horizontalLines[k].y1)\n                        && (\n                            xArray[j + 1] === horizontalLines[k].x2\n                            && yArray[j + 1] === horizontalLines[k].y2)\n                        ) || (\n                            (\n                                xArray[j + 1] === horizontalLines[k].x1\n                                && yArray[j + 1] === horizontalLines[k].y1\n                            )\n                            && (\n                                xArray[j] === horizontalLines[k].x2\n                                && yArray[j] === horizontalLines[k].y2\n                            )\n                        )\n                    ) {\n                        if (allUnits[i][0] !== invalidUnit[0]) {\n                            const allUnitsSelected: number[][] = allUnits[i];\n                            this.deleteUnits.push(allUnitsSelected[0]);\n                            // matchUnit = allUnits[i][0];\n                            this.foundHorizonalLine.push(horizontalLines[k]);\n                            find = true;\n                            break;\n                        }\n\n                    }\n                }\n            }\n\n            if (find === false) {\n                for (let k = 0; k <= horizontalLines.length - 1; k++) {\n                    if (\n                        (\n                            xArray[xArray.length - 1] === horizontalLines[k].x1\n                            && yArray[xArray.length - 1] === horizontalLines[k].y1\n                            && xArray[0] === horizontalLines[k].x2\n                            && yArray[0] === horizontalLines[k].y2\n                        ) ||\n                        (\n                            (\n                                xArray[0] === horizontalLines[k].x1\n                                && yArray[0] === horizontalLines[k].y1\n                            ) && (\n                                xArray[xArray.length - 1] === horizontalLines[k].x2\n                                && yArray[xArray.length - 1] === horizontalLines[k].y2\n                            )\n                        )\n                    ) {\n\n                        if (allUnits[i][0] !== invalidUnit[0]) {\n                            this.deleteUnits.push(allUnits[i][0]);\n                            // matchUnit = allUnits[i][0];\n                            this.foundHorizonalLine.push(horizontalLines[k]);\n                            find = true;\n                            break;\n                        }\n                    }\n                }\n            }\n\n\n\n\n        }\n        return find;\n    }\n\n    addUnitY(invalidUnit: number[][], allUnits: number[][][]) {\n        // let matchUnit = [];\n        const referenceXArray: number[] = [];\n        const referenceYArray: number[] = [];\n        const verticalLines: CasLineType[] = [];\n        let find = false;\n        for (let j = 0; j < invalidUnit[0].length - 1; j = j + 2) {\n            referenceXArray.push(invalidUnit[0][j]);\n            referenceYArray.push(invalidUnit[0][j + 1]);\n        }\n        let verticalLine = { x1: 0, y1: 0, x2: 0, y2: 0 };\n\n        for (let j = 0; j < referenceYArray.length - 1; j++) {\n            if (referenceXArray[j] === referenceXArray[j + 1]) {\n                verticalLine = { x1: referenceXArray[j], y1: referenceYArray[j],\n                    x2: referenceXArray[j + 1], y2: referenceYArray[j + 1] };\n                verticalLines.push(verticalLine);\n            }\n        }\n\n        if (referenceXArray[referenceXArray.length - 1] === referenceXArray[0]) {\n            verticalLine = { x1: referenceXArray[referenceYArray.length - 1], y1: referenceYArray[referenceYArray.length - 1],\n                x2: referenceXArray[0], y2: referenceYArray[0] };\n            verticalLines.push(verticalLine);\n        }\n\n\n\n        for (let i = 0; i <= allUnits.length - 1; i++) {\n            const xArray: number[] = [];\n            const yArray: number[] = [];\n            // this.ctx.moveTo(translateX + validPoints[i][0][0] * widthRatio, translateY + validPoints[i][0][1] * heightRatio);\n            for (let j = 0; j < allUnits[i][0].length - 1; j = j + 2) {\n                xArray.push(allUnits[i][0][j]);\n                yArray.push(allUnits[i][0][j + 1]);\n            }\n\n            for (let j = 0; j < xArray.length - 1; j++) {\n                for (let k = 0; k <= verticalLines.length - 1; k++) {\n\n                    if (\n                        (\n                            (\n                                xArray[j] === verticalLines[k].x1\n                                && yArray[j] === verticalLines[k].y1\n                            )\n                            && (\n                                xArray[j + 1] === verticalLines[k].x2\n                            && yArray[j + 1] === verticalLines[k].y2\n                            )\n                        ) || (\n                            (\n                                xArray[j + 1] === verticalLines[k].x1\n                                && yArray[j + 1] === verticalLines[k].y1\n                            ) && (\n                                xArray[j] === verticalLines[k].x2\n                                && yArray[j] === verticalLines[k].y2\n                            )\n                        )\n                    ) {\n\n                        if (allUnits[i][0] !== invalidUnit[0]) {\n                            this.deleteUnits.push(allUnits[i][0]);\n                            // matchUnit = allUnits[i][0];\n                            this.foundVerticalLine.push(verticalLines[k]);\n                            find = true;\n                            break;\n                        }\n\n                    }\n                }\n            }\n\n            if (find === false) {\n\n                for (let k = 0; k <= verticalLines.length - 1; k++) {\n                    if (\n                            (\n                                xArray[xArray.length - 1] === verticalLines[k].x1\n                                && yArray[xArray.length - 1] === verticalLines[k].y1\n                                && xArray[0] === verticalLines[k].x2\n                                && yArray[0] === verticalLines[k].y2\n                            ) || (\n                                (\n                                    xArray[0] === verticalLines[k].x1\n                                    && yArray[0] === verticalLines[k].y1\n                                ) && (\n                                    xArray[xArray.length - 1] === verticalLines[k].x2\n                                    && yArray[xArray.length - 1] === verticalLines[k].y2\n                                )\n                            )\n                    ) {\n\n                        if (allUnits[i][0] !== invalidUnit[0]) {\n                            this.deleteUnits.push(allUnits[i][0]);\n                            // matchUnit = allUnits[i][0];\n                            this.foundVerticalLine.push(verticalLines[k]);\n                            find = true;\n                            break;\n                        }\n                    }\n                }\n            }\n\n\n\n\n        }\n        return find;\n    }\n\n    get_polygon_centroid(pts: CasLineType[]) {\n        const first: CasLineType = pts[0];\n        const last: CasLineType = pts[pts.length - 1];\n        if (first.x !== last.x || first.y !== last.y) { pts.push(first); }\n        let twicearea = 0;\n        let x = 0;\n        let y = 0;\n        // let nPts = pts.length;\n        let p1: CasLineType;\n        let p2: CasLineType;\n        let f: number;\n        for (let i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n            p1 = pts[i];\n            p2 = pts[j];\n            if (p1.x && p2.y && p2.x && p1.y) {\n                f = p1.x * p2.y - p2.x * p1.y;\n                twicearea += f;\n                x += (p1.x + p2.x) * f;\n                y += (p1.y + p2.y) * f;\n            }\n        }\n        f = twicearea * 3;\n        return { x: x / f, y: y / f };\n    }\n\n\n    trim(validPoints: number[][][]){\n        const nearbyUnitsY: LineFixType = this.findInvalidUnitsY(validPoints, this.value.toString());\n        for (let i = 0; i <= nearbyUnitsY.result_array.length - 1; i++) {\n            const resultArray: number[] = nearbyUnitsY.result_array[i];\n            const deleteUnits: number[] = nearbyUnitsY.delete_units[i];\n            const foundHorizontalLine: CasLineType = nearbyUnitsY.found_horizontal_line[i];\n            const newUnit: number[] = [];\n            let index = 0;\n            let originalIndex = 0;\n            // const clockwise = false;\n            validPoints = validPoints.filter(obj => obj[0] !== resultArray);\n            validPoints = validPoints.filter(obj => obj[0] !== deleteUnits);\n            for (let j = 0; j < resultArray.length - 1; j = j + 2) {\n                newUnit.push(resultArray[j]);\n                newUnit.push(resultArray[j + 1]);\n                if (resultArray[j] === foundHorizontalLine.x1 && resultArray[j + 1] === foundHorizontalLine.y1){\n                    originalIndex = j;\n                    for (let k = 0; k < deleteUnits.length - 1; k = k + 2) {\n                        if (deleteUnits[k] === foundHorizontalLine.x1 && deleteUnits[k + 1] === foundHorizontalLine.y1)\n                        {\n                            index = k;\n                        }\n                    }\n                    break;\n                }\n            }\n            if (index !== deleteUnits.length - 2){\n                for (let j = index; j < deleteUnits.length - 1; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n\n                }\n                for (let j = 0; j < index; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n                }\n            }\n            else{\n                for (let j = 0; j < index; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n                }\n            }\n\n            for (let j = originalIndex + 2; j < resultArray.length - 1; j = j + 2){\n                newUnit.push(resultArray[j]);\n                newUnit.push(resultArray[j + 1]);\n            }\n            const pointArrayUnit: CasLineType[] = [];\n            for (let g = 0; g < newUnit.length - 1; g = g + 2) {\n                const pointsForUnits: CasLineType = { x: 0, y: 0 };\n                pointsForUnits.x = newUnit[g];\n                pointsForUnits.y = newUnit[g + 1];\n                pointArrayUnit.push(pointsForUnits);\n            }\n\n            const cutPointArray = this.cutInUnit(pointArrayUnit);\n\n            let newCut = this.cutInUnit(cutPointArray);\n\n            newCut = this.cutInUnit(newCut);\n            newCut = this.cutInUnit(newCut);\n            newCut = this.cutInUnit(newCut);\n            const sortedPointInUnit: number[] = [];\n\n            newCut.forEach(point => {\n                sortedPointInUnit.push(point.x);\n                sortedPointInUnit.push(point.y);\n            });\n            validPoints.push([sortedPointInUnit]);\n        }\n\n        const nearbyUnits: LineFixType = this.findInvalidUnitsX(validPoints, this.value.toString());\n\n\n        for (let i = 0; i <= nearbyUnits.result_array.length - 1; i++) {\n            const resultArray: number[] = nearbyUnits.result_array[i];\n            const deleteUnits: number[] = nearbyUnits.delete_units[i];\n            const foundHorizontalLine: CasLineType = nearbyUnits.found_horizontal_line[i];\n            const newUnit = [];\n            let index = 0;\n            let originalIndex = 0;\n            validPoints = validPoints.filter(obj => obj[0] !== resultArray);\n            validPoints = validPoints.filter(obj => obj[0] !== deleteUnits);\n            for (let j = 0; j < resultArray.length - 1; j = j + 2) {\n                newUnit.push(resultArray[j]);\n                newUnit.push(resultArray[j + 1]);\n                if (resultArray[j] === foundHorizontalLine.x1 && resultArray[j + 1] === foundHorizontalLine.y1){\n                    originalIndex = j;\n                    for (let k = 0; k < deleteUnits.length - 1; k = k + 2) {\n                        if (deleteUnits[k] === foundHorizontalLine.x1 && deleteUnits[k + 1] === foundHorizontalLine.y1)\n                        {\n                            index = k;\n                            console.log(index);\n                        }\n                    }\n                    break;\n                }\n            }\n\n            if (index !== deleteUnits.length - 2){\n                for (let j = index; j < deleteUnits.length - 1; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n\n                }\n                for (let j = 0; j < index; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n                }\n            }\n            else{\n                for (let j = 0; j < index; j = j + 2){\n                    newUnit.push(deleteUnits[j]);\n                    newUnit.push(deleteUnits[j + 1]);\n                }\n            }\n\n            for (let j = originalIndex + 2; j < resultArray.length - 1; j = j + 2){\n                newUnit.push(resultArray[j]);\n                newUnit.push(resultArray[j + 1]);\n            }\n            const pointArrayUnit = [];\n\n            for (let g = 0; g < newUnit.length - 1; g = g + 2) {\n                const pointsForUnits: CasLineType = { x: 0, y: 0 };\n                pointsForUnits.x = newUnit[g];\n                pointsForUnits.y = newUnit[g + 1];\n                pointArrayUnit.push(pointsForUnits);\n            }\n            const cutPointArray = this.cutInUnit(pointArrayUnit);\n\n\n            let newCut = this.cutInUnit(cutPointArray);\n            newCut = this.cutInUnit(newCut);\n            newCut = this.cutInUnit(newCut);\n            newCut = this.cutInUnit(newCut);\n            const sortedPointInUnit: number[] = [];\n\n            newCut.forEach(point => {\n                sortedPointInUnit.push(point.x);\n                sortedPointInUnit.push(point.y);\n            });\n            validPoints.push([sortedPointInUnit]);\n        }\n        return validPoints;\n    }\n    GetAngleABC(  ax: number, ay: number,  bx: number, by: number,  cx: number, cy: number )\n    {\n        const ab = [bx - ax, by - ay]  ;\n        const cb = [ bx - cx, by - cy ];\n\n        // dot product\n        const dot = (ab[0] * cb[0] + ab[1] * cb[1]);\n\n        // length square of both vectors\n        const abSqr = ab[0] * ab[0] + ab[1] * ab[1];\n        const cbSqr = cb[0] * cb[0] + cb[1] * cb[1];\n\n        // square of cosine of the needed angle\n        const cosSqr = dot * dot / abSqr / cbSqr;\n\n        // this is a known trigonometric equality:\n        // cos(alpha * 2) = [ cos(alpha) ]^2 * 2 - 1\n        const cos2 = 2 * cosSqr - 1;\n\n        // Here's the only invocation of the heavy function.\n        // It's a good idea to check explicitly if cos2 is within [-1 .. 1] range\n\n        const  pi = Math.PI;\n\n        const alpha2 =\n            (cos2 <= -1) ? pi :\n            (cos2 >= 1) ? 0 :\n            Math.acos(cos2);\n\n        const rslt = alpha2 / 2;\n\n        let rs = rslt * 180. / pi;\n\n\n        // Now revolve the ambiguities.\n        // 1. If dot product of two vectors is negative - the angle is definitely\n        // above 90 degrees. Still we have no information regarding the sign of the angle.\n\n        // NOTE: This ambiguity is the consequence of our method: calculating the cosine\n        // of the double angle. This allows us to get rid of calling sqrt.\n\n        if (dot < 0){\n            rs = 180 - rs;\n        }\n\n        // 2. Determine the sign. For this we'll use the Determinant of two vectors.\n\n        const det = (ab[0] * cb[1] - ab[1] * cb[1]);\n        if (det < 0){\n            rs = -rs;\n        }\n        return  Math.floor(rs + 0.5);\n\n\n    }\n\n\n}\n\n\n","<div class=\"row\">\n    <div class=\"col-2 text-left smallFont\" >\n        Orb:<input type=\"text\" class=\"form-control small\" (input)=\"tolerance=$event.target.value\" value=\"50\">\n    </div>\n    <div class=\"col-2 text-left smallFont\">\n        L1:<input type=\"text\" class=\"form-control small\" (input)=\"L1=$event.target.value\" >\n    </div>\n    <div class=\"col-2 text-left smallFont\">\n        W1:<input type=\"text\" class=\"form-control small\" (input)=\"W1=$event.target.value\" >\n    </div>\n    <div class=\"col-6 text-left smallFont\">\n        <button (click)=\"Subdivide()\" class=\"btn btn-sm btn-light align-middle\">\n            <fa-icon [icon]=\"faSearch\"></fa-icon>\n        </button>\n        <button (click)=\"RotatePolygon()\" class=\"btn btn-sm btn-light align-middle\">\n            <fa-icon [icon]=\"faRotate\"></fa-icon>\n        </button>\n    </div>\n\n</div>\n<br/>\n<div class=\"row\">\n    <div class=\"col-12 pl-0 text-left\">\n        <canvas #canvas class=\"polygon-canvas\"></canvas>\n    </div>\n</div>\n\n\n","import {Component} from '@angular/core';\nimport {NavigationModel} from '@cas-hub/acabim-common-client';\n\n@Component({\n  selector: 'acaland-settings',\n  templateUrl: './settings.component.html',\n  styleUrls: ['./settings.component.scss']\n})\n\nexport class SettingsComponent {\n\n    public routes: NavigationModel[] = [\n        {\n            title: 'Manage Site and Project',\n            link: 'site-config'\n        }\n    ];\n}\n","<h1>Setup & Configurations</h1>\n\n<acabim-card cardHeading=\"Settings\" [cardContent]=\"settingsList\">\n\n</acabim-card>\n\n<ng-template #settingsList>\n    <ul *ngFor=\"let route of routes\">\n        <li><a routerLink=\"{{route.link}}\">{{route.title}}</a></li>\n    </ul>\n</ng-template>\n","import { Component, OnInit } from '@angular/core';\n\n@Component({\n  selector: 'acaland-contacts',\n  templateUrl: './contacts.component.html',\n  styleUrls: ['./contacts.component.scss']\n})\nexport class ContactsComponent implements OnInit {\n\n  constructor() { }\n\n  ngOnInit(): void {\n  }\n\n}\n","<h1 class=\"title\">Contacts</h1>\n<h5>List of professionals/consultants</h5>\n\n\n<div class=\"cas-error\">No contacts available at the moment</div>\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {RouterModule} from '@angular/router';\nimport {CdkTableModule} from '@angular/cdk/table';\nimport {StoreModule} from '@ngrx/store';\nimport * as AcaLandReducers from './_store/reducers';\n// import { EffectsModule } from '@ngrx/effects';\n// import {SubdivisionEffects} from './_store/events';\n\n// STYLES\nimport {FontAwesomeModule} from '@fortawesome/angular-fontawesome';\nimport {MatDialogModule} from '@angular/material/dialog';\nimport {MatExpansionModule} from '@angular/material/expansion';\nimport {NgbCollapseModule} from '@ng-bootstrap/ng-bootstrap';\n\n// PRIME NG\nimport {BreadcrumbModule} from 'primeng/breadcrumb';\nimport {ButtonModule} from 'primeng/button';\nimport {CardModule} from 'primeng/card';\nimport {CheckboxModule} from 'primeng/checkbox';\nimport {ConfirmDialogModule} from 'primeng/confirmdialog';\nimport {DialogModule} from 'primeng/dialog';\nimport {DropdownModule} from 'primeng/dropdown';\nimport {DialogService, DynamicDialogModule} from 'primeng/dynamicdialog';\nimport {FieldsetModule} from 'primeng/fieldset';\nimport {FileUploadModule} from 'primeng/fileupload';\nimport {InputTextModule} from 'primeng/inputtext';\nimport {InputTextareaModule} from 'primeng/inputtextarea';\nimport {MessageModule} from 'primeng/message';\nimport {MessagesModule} from 'primeng/messages';\nimport {PickListModule} from 'primeng/picklist';\nimport {ProgressSpinnerModule} from 'primeng/progressspinner';\nimport {RadioButtonModule} from 'primeng/radiobutton';\nimport {RippleModule} from 'primeng/ripple';\nimport {TableModule} from 'primeng/table';\nimport {TabViewModule} from 'primeng/tabview';\nimport {ToastModule} from 'primeng/toast';\nimport {ToolbarModule} from 'primeng/toolbar';\nimport {TooltipModule} from 'primeng/tooltip';\n\n// ACABIM\nimport {\n    AcabimAuthGuardService,\n    AcabimCommonModule,\n    AcabimSolution,\n    SolutionEnvironmentModel,\n} from '@cas-hub/acabim-common-client';\nimport {AcabimQaModule} from '@cas-hub/acabim-qa-client';\nimport {AcabimWorkModule} from '@cas-hub/acabim-work-client';\n\n// Land components\nimport {AcaLandLayoutComponent} from './acaland-layout.component';\n// tslint:disable-next-line:max-line-length\nimport {AddProjectComponent} from './pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/add-project/add-project.component';\nimport {BuildingDataViewerComponent} from './pages/land-development/building-data-viewer/building-data-viewer.component';\nimport {ComplianceChecklistsComponent} from './pages/compliance-checklists/compliance-checklists.component';\nimport {DashboardComponent} from './pages/dashboard/dashboard.component';\nimport {DesignParamsViewerComponent} from './pages/land-development/design-params-viewer/design-params-viewer.component';\nimport {DocumentsComponent} from './pages/land-development/documents/documents.component';\nimport {LandDevelopmentComponent} from './pages/land-development/land-development.component';\nimport {LandTableDashboardComponent} from './pages/land-table-dashboard/land-table-dashboard.component';\nimport {PolygonComponent} from './_components/polygon/polygon.component';\nimport {PropertyParcelDataViewerComponent} from './pages/land-development/property-parcel-data-viewer/property-parcel-data-viewer.component';\nimport {SettingsComponent} from './pages/settings/settings.component';\nimport {SiteAdjoinComponent} from './pages/land-development/site-adjoin/site-adjoin.component';\nimport {SiteDetailComponent} from './pages/site-detail/site-detail.component';\nimport {SiteSubdivisionMapComponent} from './pages/land-development/site-subdivision-map/site-subdivision-map.component';\nimport {SubdivisionCalculationAnalysisComponent} from './pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-analysis/subdivision-calculation-analysis.component';\nimport {SubdivisionCalculationComponent} from './pages/land-development/subdivision-calculation/subdivision-calculation.component';\nimport {SubdivisionCalculationDetailComponent} from './pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-detail.component';\nimport {SubdivisionCalculationResultComponent} from './pages/land-development/subdivision-calculation/subdivision-calculation-detail/subdivision-calculation-result/subdivision-calculation-result.component';\nimport {TopoDataViewerComponent} from './pages/land-development/topo-data-viewer/topo-data-viewer.component';\nimport { ContactsComponent } from './pages/land-development/contacts/contacts.component';\nimport { CustomAcabimMapComponent } from './_components/map/map.component';\nimport { Map3DComponent } from './_components/3dmap/map-viewer.component';\n\n@NgModule({\n    declarations: [\n        AcaLandLayoutComponent,\n        AddProjectComponent,\n        BuildingDataViewerComponent,\n        ComplianceChecklistsComponent,\n        DashboardComponent,\n        DesignParamsViewerComponent,\n        DocumentsComponent,\n        LandDevelopmentComponent,\n        LandTableDashboardComponent,\n        PolygonComponent,\n        PropertyParcelDataViewerComponent,\n        SettingsComponent,\n        SiteAdjoinComponent,\n        SiteDetailComponent,\n        SiteSubdivisionMapComponent,\n        SubdivisionCalculationAnalysisComponent,\n        SubdivisionCalculationComponent,\n        SubdivisionCalculationDetailComponent,\n        SubdivisionCalculationResultComponent,\n        TopoDataViewerComponent,\n        ContactsComponent,\n        CustomAcabimMapComponent,\n        Map3DComponent,\n    ],\n    imports: [\n        AcabimQaModule,\n        AcabimWorkModule,\n        BreadcrumbModule,\n        ButtonModule,\n        CardModule,\n        CdkTableModule,\n        CheckboxModule,\n        CommonModule,\n        ConfirmDialogModule,\n        DialogModule,\n        DropdownModule,\n        DynamicDialogModule,\n        FieldsetModule,\n        FileUploadModule,\n        FontAwesomeModule,\n        FormsModule,\n        InputTextModule,\n        InputTextareaModule,\n        MatDialogModule,\n        MatExpansionModule,\n        MessageModule,\n        MessagesModule,\n        NgbCollapseModule,\n        PickListModule,\n        ProgressSpinnerModule,\n        RadioButtonModule,\n        ReactiveFormsModule,\n        RippleModule,\n        TabViewModule,\n        TableModule,\n        ToastModule,\n        ToolbarModule,\n        TooltipModule,\n        StoreModule.forRoot({subdivision: AcaLandReducers.SubdivisionReducer}, {}),\n        // EffectsModule.forFeature([SubdivisionEffects]),\n        AcabimCommonModule.forRoot({\n            navigation: {items: new AcaLandLayoutComponent().navItems},\n            solutionEnvironment: new SolutionEnvironmentModel(AcabimSolution.ACALand)\n        }),\n        RouterModule.forChild([\n            {\n                path: '',\n                canActivate: [AcabimAuthGuardService],\n                component: AcaLandLayoutComponent,\n                children: [\n                    {path: '', redirectTo: 'dashboard'},\n                    {path: 'dashboard', component: DashboardComponent},\n                    {path: 'land-development', component: LandDevelopmentComponent},\n                    {path: 'land-development/documents', component: DocumentsComponent},\n                    {path: 'land-development/contacts', component: ContactsComponent},\n                    {path: 'compliance-checklists', component: ComplianceChecklistsComponent},\n                ]\n            }\n        ]),\n\n    ],\n    exports: [],\n    providers: [\n        DialogService,\n        {\n            provide: SolutionEnvironmentModel,\n            useValue: new SolutionEnvironmentModel(AcabimSolution.ACALand)\n        }\n    ],\n    bootstrap: [AcaLandLayoutComponent]\n})\nexport class AcaLandModule {\n}\n"]}