[{"data":1,"prerenderedAt":3653},["ShallowReactive",2],{"navigation":3,"\u002Fsync-api\u002Faws-lambda-python":99,"\u002Fsync-api\u002Faws-lambda-python-surround":3648},[4,16,52,71,91],{"title":5,"path":6,"stem":7,"children":8,"icon":15},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Authentication","\u002Fgetting-started\u002Fauthentication","1.getting-started\u002F2.authentication","i-lucide-rocket",{"title":17,"path":18,"stem":19,"children":20,"icon":51},"GraphQL API","\u002Fgraphql-api","2.graphql-api\u002F1.index",[21,23,27,31,35,39,43,47],{"title":22,"path":18,"stem":19},"API Overview",{"title":24,"path":25,"stem":26},"Querying Patterns","\u002Fgraphql-api\u002Fquerying","2.graphql-api\u002F2.querying",{"title":28,"path":29,"stem":30},"Mutation Patterns","\u002Fgraphql-api\u002Fmutations","2.graphql-api\u002F3.mutations",{"title":32,"path":33,"stem":34},"List SaaS Applications","\u002Fgraphql-api\u002Fguides\u002Flist-applications","2.graphql-api\u002F4.guides\u002F1.list-applications",{"title":36,"path":37,"stem":38},"Find Unused Licenses","\u002Fgraphql-api\u002Fguides\u002Ffind-unused-licenses","2.graphql-api\u002F4.guides\u002F2.find-unused-licenses",{"title":40,"path":41,"stem":42},"Retrieve Upcoming Renewals","\u002Fgraphql-api\u002Fguides\u002Fupcoming-renewals","2.graphql-api\u002F4.guides\u002F3.upcoming-renewals",{"title":44,"path":45,"stem":46},"Handle GraphQL Errors","\u002Fgraphql-api\u002Fguides\u002Fhandle-errors","2.graphql-api\u002F4.guides\u002F4.handle-errors",{"title":48,"path":49,"icon":50},"API Reference","\u002Fgql-schema-reference","i-lucide-file-code","i-lucide-braces",{"title":53,"path":54,"stem":55,"children":56,"icon":70},"Sync API","\u002Fsync-api","3.sync-api\u002F1.index",[57,59,63,67],{"title":58,"path":54,"stem":55},"Viio Sync API",{"title":60,"path":61,"stem":62},"Quickstart","\u002Fsync-api\u002Fquickstart","3.sync-api\u002F2.quickstart",{"title":64,"path":65,"icon":66},"Examples","\u002Fsync-api\u002Faws-lambda-python","i-lucide-code-xml",{"title":68,"path":69,"icon":50},"SDK Reference","\u002Fsync-api\u002Fapi-reference","i-lucide-refresh-cw",{"title":72,"path":73,"stem":74,"children":75,"icon":90},"MCP Server","\u002Fmcp-server","4.mcp-server\u002F1.index",[76,78,82,86],{"title":77,"path":73,"stem":74},"Viio MCP Server",{"title":79,"path":80,"stem":81},"Setup","\u002Fmcp-server\u002Fsetup","4.mcp-server\u002F2.setup",{"title":83,"path":84,"stem":85},"Available Tools","\u002Fmcp-server\u002Ftools","4.mcp-server\u002F3.tools",{"title":87,"path":88,"stem":89},"SaaS Analysis Use Cases","\u002Fmcp-server\u002Fuse-cases","4.mcp-server\u002F4.use-cases","i-lucide-bot",{"title":92,"path":93,"stem":94,"children":95,"icon":98},"AI Integration","\u002Fai","5.ai\u002F1.index",[96],{"title":97,"path":93,"stem":94},"llms.txt","i-lucide-sparkles",{"id":100,"title":101,"body":102,"dateModified":3637,"datePublished":3638,"description":3639,"extension":3640,"links":3641,"meta":3642,"navigation":300,"path":65,"seo":3643,"stem":3646,"__hash__":3647},"docs\u002F3.sync-api\u002F6.aws-lambda-python.md","AWS Lambda with Python",{"type":103,"value":104,"toc":3630},"minimark",[105,122,128,136,141,144,171,178,188,192,198,3267,3277,3280,3289,3293,3296,3374,3377,3381,3390,3522,3526,3532,3607,3618,3622,3626],[106,107,108,109,113,114,121],"p",{},"This example runs a nightly Microsoft Entra employee sync from AWS Lambda. The function acquires a Microsoft Graph application token, processes every page of users, maps the records to ",[110,111,112],"code",{},"MicrosoftEmployeeDetails",", and writes the complete snapshot through the ",[115,116,120],"a",{"href":117,"rel":118},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fviio-sync-api-sdk\u002F",[119],"nofollow","Viio Python SDK",".",[106,123,124,125,121],{},"It is a concrete Python snapshot example. For the entity-neutral lifecycle and event-processing behavior, start with the ",[115,126,127],{"href":61},"quickstart",[129,130,133],"callout",{"color":131,"icon":132},"amber","i-lucide-triangle-alert",[106,134,135],{},"The function must process every Microsoft Graph page before completing the batch. Completing a partial employee snapshot can mark valid employees as removed.",[137,138,140],"h2",{"id":139},"prerequisites","Prerequisites",[106,142,143],{},"You need:",[145,146,147,151,154,161,168],"ul",{},[148,149,150],"li",{},"Python 3.11 or later.",[148,152,153],{},"A passive direct integration installation and its ID.",[148,155,156,157,160],{},"A Viio API key with the ",[110,158,159],{},"integration:sync"," permission.",[148,162,163,164,167],{},"A Microsoft Entra application with the Microsoft Graph ",[110,165,166],{},"User.Read.All"," application permission and tenant-wide admin consent.",[148,169,170],{},"The Entra tenant ID, client ID, and client secret.",[106,172,173,174,177],{},"Add the SDK to ",[110,175,176],{},"requirements.txt",":",[179,180,186],"pre",{"className":181,"code":183,"language":184,"meta":185},[182],"language-text","viio-sync-api-sdk\n","text","",[110,187,183],{"__ignoreMap":185},[137,189,191],{"id":190},"lambda-handler","Lambda Handler",[106,193,194,195,177],{},"Create ",[110,196,197],{},"aws_lambda.py",[179,199,203],{"className":200,"code":201,"language":202,"meta":185,"style":185},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import asyncio\nimport json\nimport os\nfrom typing import Any\nfrom urllib.parse import urlencode, urlsplit\nfrom urllib.request import Request, urlopen\n\nfrom viio_sync_api import SyncApiAuthentication, SyncApiClient, SyncApiClientOptions\nfrom viio_sync_api.v1 import (\n    Employee,\n    EmployeeRecords,\n    MicrosoftEmployeeDetails,\n    MicrosoftEmployeeOrgData,\n    SyncRecordsRequest,\n)\n\n\nGRAPH_USERS_URL = \"https:\u002F\u002Fgraph.microsoft.com\u002Fv1.0\u002Fusers?\" + urlencode(\n    {\n        \"$select\": \",\".join(\n            (\n                \"id\",\n                \"displayName\",\n                \"givenName\",\n                \"surname\",\n                \"mail\",\n                \"userPrincipalName\",\n                \"department\",\n                \"accountEnabled\",\n                \"jobTitle\",\n                \"userType\",\n                \"country\",\n                \"employeeOrgData\",\n            )\n        ),\n        \"$top\": \"999\",\n    }\n)\n\n\ndef request_json(request: Request) -> dict[str, Any]:\n    with urlopen(request, timeout=30) as response:\n        payload = json.load(response)\n    if not isinstance(payload, dict):\n        raise RuntimeError(\"Remote service returned an invalid JSON response\")\n    return payload\n\n\ndef request_graph_token() -> str:\n    tenant_id = os.environ[\"MICROSOFT_TENANT_ID\"]\n    allowed_characters = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-\"\n    if not tenant_id or any(character not in allowed_characters for character in tenant_id):\n        raise ValueError(\"MICROSOFT_TENANT_ID must be a tenant ID or verified domain name\")\n\n    request = Request(\n        f\"https:\u002F\u002Flogin.microsoftonline.com\u002F{tenant_id}\u002Foauth2\u002Fv2.0\u002Ftoken\",\n        data=urlencode(\n            {\n                \"grant_type\": \"client_credentials\",\n                \"client_id\": os.environ[\"MICROSOFT_CLIENT_ID\"],\n                \"client_secret\": os.environ[\"MICROSOFT_CLIENT_SECRET\"],\n                \"scope\": \"https:\u002F\u002Fgraph.microsoft.com\u002F.default\",\n            }\n        ).encode(),\n        headers={\"Content-Type\": \"application\u002Fx-www-form-urlencoded\"},\n        method=\"POST\",\n    )\n    token = request_json(request).get(\"access_token\")\n    if not isinstance(token, str) or not token:\n        raise RuntimeError(\"Microsoft identity platform returned no access token\")\n    return token\n\n\ndef request_graph_users(url: str, access_token: str) -> tuple[list[dict[str, Any]], str | None]:\n    parsed_url = urlsplit(url)\n    if parsed_url.scheme != \"https\" or parsed_url.hostname != \"graph.microsoft.com\":\n        raise RuntimeError(\"Microsoft Graph returned an invalid pagination URL\")\n\n    payload = request_json(\n        Request(\n            url,\n            headers={\n                \"Accept\": \"application\u002Fjson\",\n                \"Authorization\": f\"Bearer {access_token}\",\n            },\n        )\n    )\n    users = payload.get(\"value\")\n    if not isinstance(users, list) or not all(isinstance(user, dict) for user in users):\n        raise RuntimeError(\"Microsoft Graph returned an invalid users response\")\n\n    next_url = payload.get(\"@odata.nextLink\")\n    if next_url is not None and not isinstance(next_url, str):\n        raise RuntimeError(\"Microsoft Graph returned an invalid pagination URL\")\n    return users, next_url\n\n\ndef required_string(source: dict[str, Any], field: str) -> str:\n    value = source.get(field)\n    if not isinstance(value, str) or not value:\n        raise RuntimeError(f\"Microsoft Graph user is missing {field}\")\n    return value\n\n\ndef optional_string(source: dict[str, Any], field: str) -> str | None:\n    value = source.get(field)\n    return value if isinstance(value, str) and value else None\n\n\ndef optional_bool(source: dict[str, Any], field: str) -> bool | None:\n    value = source.get(field)\n    return value if isinstance(value, bool) else None\n\n\ndef employee_org_data(user: dict[str, Any]) -> MicrosoftEmployeeOrgData | None:\n    value = user.get(\"employeeOrgData\")\n    if not isinstance(value, dict):\n        return None\n\n    division = optional_string(value, \"division\")\n    cost_center = optional_string(value, \"costCenter\")\n    if division is None and cost_center is None:\n        return None\n\n    return MicrosoftEmployeeOrgData(division=division, cost_center=cost_center)\n\n\ndef employee_from_graph_user(user: dict[str, Any]) -> Employee:\n    return Employee(\n        microsoft=MicrosoftEmployeeDetails(\n            id=required_string(user, \"id\"),\n            display_name=required_string(user, \"displayName\"),\n            given_name=optional_string(user, \"givenName\"),\n            surname=optional_string(user, \"surname\"),\n            mail=optional_string(user, \"mail\"),\n            user_principal_name=required_string(user, \"userPrincipalName\"),\n            department=optional_string(user, \"department\"),\n            account_enabled=optional_bool(user, \"accountEnabled\"),\n            job_title=optional_string(user, \"jobTitle\"),\n            user_type=optional_string(user, \"userType\"),\n            country=optional_string(user, \"country\"),\n            employee_org_data=employee_org_data(user),\n        )\n    )\n\n\nasync def sync_employees() -> int:\n    graph_token = await asyncio.to_thread(request_graph_token)\n    options = SyncApiClientOptions(\n        endpoint=os.environ[\"VIIO_SYNC_API_ENDPOINT\"],\n        authentication=SyncApiAuthentication.api_key(os.environ[\"VIIO_SYNC_API_KEY\"]),\n    )\n\n    async with SyncApiClient(options) as client:\n        batch = await client.start_batch(os.environ[\"VIIO_DIRECT_INTEGRATION_INSTALLATION_ID\"])\n        employee_count = 0\n        next_url: str | None = GRAPH_USERS_URL\n        try:\n            while next_url is not None:\n                users, next_url = await asyncio.to_thread(request_graph_users, next_url, graph_token)\n                if users:\n                    employees = [employee_from_graph_user(user) for user in users]\n                    await batch.write(SyncRecordsRequest(employees=EmployeeRecords(records=employees)))\n                    employee_count += len(employees)\n\n            if employee_count == 0:\n                await batch.write(SyncRecordsRequest(employees=EmployeeRecords()))\n            await batch.complete()\n        except BaseException:\n            await batch.abort()\n            raise\n        return employee_count\n\n\ndef lambda_handler(event: dict[str, Any], context: object) -> dict[str, Any]:\n    del event, context\n    employee_count = asyncio.run(sync_employees())\n    return {\"ok\": True, \"employee_count\": employee_count}\n","python",[110,204,205,218,226,234,248,273,295,302,325,343,352,360,368,376,384,390,395,400,428,434,460,466,479,491,503,515,527,539,551,563,575,587,599,611,617,623,644,650,655,660,665,710,745,768,792,812,821,826,831,849,878,894,938,957,962,974,997,1010,1016,1037,1067,1096,1117,1123,1135,1163,1180,1186,1217,1247,1265,1273,1278,1283,1345,1362,1405,1423,1428,1440,1448,1456,1465,1486,1514,1520,1526,1531,1557,1614,1632,1637,1662,1696,1713,1725,1730,1735,1778,1800,1828,1853,1861,1866,1871,1914,1933,1966,1971,1976,2019,2038,2064,2069,2074,2111,2135,2154,2162,2167,2192,2217,2238,2245,2250,2278,2283,2288,2321,2330,2342,2368,2392,2417,2441,2465,2489,2513,2538,2562,2586,2610,2627,2632,2637,2642,2647,2668,2694,2707,2733,2769,2774,2779,2804,2841,2852,2872,2880,2894,2931,2941,2971,3012,3030,3035,3052,3079,3095,3106,3120,3126,3134,3139,3144,3195,3209,3232],{"__ignoreMap":185},[206,207,210,214],"span",{"class":208,"line":209},"line",1,[206,211,213],{"class":212},"s7zQu","import",[206,215,217],{"class":216},"sTEyZ"," asyncio\n",[206,219,221,223],{"class":208,"line":220},2,[206,222,213],{"class":212},[206,224,225],{"class":216}," json\n",[206,227,229,231],{"class":208,"line":228},3,[206,230,213],{"class":212},[206,232,233],{"class":216}," os\n",[206,235,237,240,243,245],{"class":208,"line":236},4,[206,238,239],{"class":212},"from",[206,241,242],{"class":216}," typing ",[206,244,213],{"class":212},[206,246,247],{"class":216}," Any\n",[206,249,251,253,256,259,262,264,267,270],{"class":208,"line":250},5,[206,252,239],{"class":212},[206,254,255],{"class":216}," urllib",[206,257,121],{"class":258},"sMK4o",[206,260,261],{"class":216},"parse ",[206,263,213],{"class":212},[206,265,266],{"class":216}," urlencode",[206,268,269],{"class":258},",",[206,271,272],{"class":216}," urlsplit\n",[206,274,276,278,280,282,285,287,290,292],{"class":208,"line":275},6,[206,277,239],{"class":212},[206,279,255],{"class":216},[206,281,121],{"class":258},[206,283,284],{"class":216},"request ",[206,286,213],{"class":212},[206,288,289],{"class":216}," Request",[206,291,269],{"class":258},[206,293,294],{"class":216}," urlopen\n",[206,296,298],{"class":208,"line":297},7,[206,299,301],{"emptyLinePlaceholder":300},true,"\n",[206,303,305,307,310,312,315,317,320,322],{"class":208,"line":304},8,[206,306,239],{"class":212},[206,308,309],{"class":216}," viio_sync_api ",[206,311,213],{"class":212},[206,313,314],{"class":216}," SyncApiAuthentication",[206,316,269],{"class":258},[206,318,319],{"class":216}," SyncApiClient",[206,321,269],{"class":258},[206,323,324],{"class":216}," SyncApiClientOptions\n",[206,326,328,330,333,335,338,340],{"class":208,"line":327},9,[206,329,239],{"class":212},[206,331,332],{"class":216}," viio_sync_api",[206,334,121],{"class":258},[206,336,337],{"class":216},"v1 ",[206,339,213],{"class":212},[206,341,342],{"class":258}," (\n",[206,344,346,349],{"class":208,"line":345},10,[206,347,348],{"class":216},"    Employee",[206,350,351],{"class":258},",\n",[206,353,355,358],{"class":208,"line":354},11,[206,356,357],{"class":216},"    EmployeeRecords",[206,359,351],{"class":258},[206,361,363,366],{"class":208,"line":362},12,[206,364,365],{"class":216},"    MicrosoftEmployeeDetails",[206,367,351],{"class":258},[206,369,371,374],{"class":208,"line":370},13,[206,372,373],{"class":216},"    MicrosoftEmployeeOrgData",[206,375,351],{"class":258},[206,377,379,382],{"class":208,"line":378},14,[206,380,381],{"class":216},"    SyncRecordsRequest",[206,383,351],{"class":258},[206,385,387],{"class":208,"line":386},15,[206,388,389],{"class":258},")\n",[206,391,393],{"class":208,"line":392},16,[206,394,301],{"emptyLinePlaceholder":300},[206,396,398],{"class":208,"line":397},17,[206,399,301],{"emptyLinePlaceholder":300},[206,401,403,406,409,412,416,419,422,425],{"class":208,"line":402},18,[206,404,405],{"class":216},"GRAPH_USERS_URL ",[206,407,408],{"class":258},"=",[206,410,411],{"class":258}," \"",[206,413,415],{"class":414},"sfazB","https:\u002F\u002Fgraph.microsoft.com\u002Fv1.0\u002Fusers?",[206,417,418],{"class":258},"\"",[206,420,421],{"class":258}," +",[206,423,266],{"class":424},"s2Zo4",[206,426,427],{"class":258},"(\n",[206,429,431],{"class":208,"line":430},19,[206,432,433],{"class":258},"    {\n",[206,435,437,440,443,445,447,449,451,453,455,458],{"class":208,"line":436},20,[206,438,439],{"class":258},"        \"",[206,441,442],{"class":414},"$select",[206,444,418],{"class":258},[206,446,177],{"class":258},[206,448,411],{"class":258},[206,450,269],{"class":414},[206,452,418],{"class":258},[206,454,121],{"class":258},[206,456,457],{"class":424},"join",[206,459,427],{"class":258},[206,461,463],{"class":208,"line":462},21,[206,464,465],{"class":258},"            (\n",[206,467,469,472,475,477],{"class":208,"line":468},22,[206,470,471],{"class":258},"                \"",[206,473,474],{"class":414},"id",[206,476,418],{"class":258},[206,478,351],{"class":258},[206,480,482,484,487,489],{"class":208,"line":481},23,[206,483,471],{"class":258},[206,485,486],{"class":414},"displayName",[206,488,418],{"class":258},[206,490,351],{"class":258},[206,492,494,496,499,501],{"class":208,"line":493},24,[206,495,471],{"class":258},[206,497,498],{"class":414},"givenName",[206,500,418],{"class":258},[206,502,351],{"class":258},[206,504,506,508,511,513],{"class":208,"line":505},25,[206,507,471],{"class":258},[206,509,510],{"class":414},"surname",[206,512,418],{"class":258},[206,514,351],{"class":258},[206,516,518,520,523,525],{"class":208,"line":517},26,[206,519,471],{"class":258},[206,521,522],{"class":414},"mail",[206,524,418],{"class":258},[206,526,351],{"class":258},[206,528,530,532,535,537],{"class":208,"line":529},27,[206,531,471],{"class":258},[206,533,534],{"class":414},"userPrincipalName",[206,536,418],{"class":258},[206,538,351],{"class":258},[206,540,542,544,547,549],{"class":208,"line":541},28,[206,543,471],{"class":258},[206,545,546],{"class":414},"department",[206,548,418],{"class":258},[206,550,351],{"class":258},[206,552,554,556,559,561],{"class":208,"line":553},29,[206,555,471],{"class":258},[206,557,558],{"class":414},"accountEnabled",[206,560,418],{"class":258},[206,562,351],{"class":258},[206,564,566,568,571,573],{"class":208,"line":565},30,[206,567,471],{"class":258},[206,569,570],{"class":414},"jobTitle",[206,572,418],{"class":258},[206,574,351],{"class":258},[206,576,578,580,583,585],{"class":208,"line":577},31,[206,579,471],{"class":258},[206,581,582],{"class":414},"userType",[206,584,418],{"class":258},[206,586,351],{"class":258},[206,588,590,592,595,597],{"class":208,"line":589},32,[206,591,471],{"class":258},[206,593,594],{"class":414},"country",[206,596,418],{"class":258},[206,598,351],{"class":258},[206,600,602,604,607,609],{"class":208,"line":601},33,[206,603,471],{"class":258},[206,605,606],{"class":414},"employeeOrgData",[206,608,418],{"class":258},[206,610,351],{"class":258},[206,612,614],{"class":208,"line":613},34,[206,615,616],{"class":258},"            )\n",[206,618,620],{"class":208,"line":619},35,[206,621,622],{"class":258},"        ),\n",[206,624,626,628,631,633,635,637,640,642],{"class":208,"line":625},36,[206,627,439],{"class":258},[206,629,630],{"class":414},"$top",[206,632,418],{"class":258},[206,634,177],{"class":258},[206,636,411],{"class":258},[206,638,639],{"class":414},"999",[206,641,418],{"class":258},[206,643,351],{"class":258},[206,645,647],{"class":208,"line":646},37,[206,648,649],{"class":258},"    }\n",[206,651,653],{"class":208,"line":652},38,[206,654,389],{"class":258},[206,656,658],{"class":208,"line":657},39,[206,659,301],{"emptyLinePlaceholder":300},[206,661,663],{"class":208,"line":662},40,[206,664,301],{"emptyLinePlaceholder":300},[206,666,668,672,675,678,682,684,686,689,692,695,698,702,704,707],{"class":208,"line":667},41,[206,669,671],{"class":670},"spNyl","def",[206,673,674],{"class":424}," request_json",[206,676,677],{"class":258},"(",[206,679,681],{"class":680},"sHdIc","request",[206,683,177],{"class":258},[206,685,289],{"class":216},[206,687,688],{"class":258},")",[206,690,691],{"class":258}," ->",[206,693,694],{"class":216}," dict",[206,696,697],{"class":258},"[",[206,699,701],{"class":700},"sBMFI","str",[206,703,269],{"class":258},[206,705,706],{"class":216}," Any",[206,708,709],{"class":258},"]:\n",[206,711,713,716,719,721,723,725,728,730,734,736,739,742],{"class":208,"line":712},42,[206,714,715],{"class":212},"    with",[206,717,718],{"class":424}," urlopen",[206,720,677],{"class":258},[206,722,681],{"class":424},[206,724,269],{"class":258},[206,726,727],{"class":680}," timeout",[206,729,408],{"class":258},[206,731,733],{"class":732},"sbssI","30",[206,735,688],{"class":258},[206,737,738],{"class":212}," as",[206,740,741],{"class":216}," response",[206,743,744],{"class":258},":\n",[206,746,748,751,753,756,758,761,763,766],{"class":208,"line":747},43,[206,749,750],{"class":216},"        payload ",[206,752,408],{"class":258},[206,754,755],{"class":216}," json",[206,757,121],{"class":258},[206,759,760],{"class":424},"load",[206,762,677],{"class":258},[206,764,765],{"class":424},"response",[206,767,389],{"class":258},[206,769,771,774,777,780,782,785,787,789],{"class":208,"line":770},44,[206,772,773],{"class":212},"    if",[206,775,776],{"class":258}," not",[206,778,779],{"class":424}," isinstance",[206,781,677],{"class":258},[206,783,784],{"class":424},"payload",[206,786,269],{"class":258},[206,788,694],{"class":700},[206,790,791],{"class":258},"):\n",[206,793,795,798,801,803,805,808,810],{"class":208,"line":794},45,[206,796,797],{"class":212},"        raise",[206,799,800],{"class":700}," RuntimeError",[206,802,677],{"class":258},[206,804,418],{"class":258},[206,806,807],{"class":414},"Remote service returned an invalid JSON response",[206,809,418],{"class":258},[206,811,389],{"class":258},[206,813,815,818],{"class":208,"line":814},46,[206,816,817],{"class":212},"    return",[206,819,820],{"class":216}," payload\n",[206,822,824],{"class":208,"line":823},47,[206,825,301],{"emptyLinePlaceholder":300},[206,827,829],{"class":208,"line":828},48,[206,830,301],{"emptyLinePlaceholder":300},[206,832,834,836,839,842,844,847],{"class":208,"line":833},49,[206,835,671],{"class":670},[206,837,838],{"class":424}," request_graph_token",[206,840,841],{"class":258},"()",[206,843,691],{"class":258},[206,845,846],{"class":700}," str",[206,848,744],{"class":258},[206,850,852,855,857,860,862,866,868,870,873,875],{"class":208,"line":851},50,[206,853,854],{"class":216},"    tenant_id ",[206,856,408],{"class":258},[206,858,859],{"class":216}," os",[206,861,121],{"class":258},[206,863,865],{"class":864},"swJcz","environ",[206,867,697],{"class":258},[206,869,418],{"class":258},[206,871,872],{"class":414},"MICROSOFT_TENANT_ID",[206,874,418],{"class":258},[206,876,877],{"class":258},"]\n",[206,879,881,884,886,888,891],{"class":208,"line":880},51,[206,882,883],{"class":216},"    allowed_characters ",[206,885,408],{"class":258},[206,887,411],{"class":258},[206,889,890],{"class":414},"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-",[206,892,893],{"class":258},"\"\n",[206,895,897,899,901,904,907,910,912,915,918,921,924,927,930,933,936],{"class":208,"line":896},52,[206,898,773],{"class":212},[206,900,776],{"class":258},[206,902,903],{"class":216}," tenant_id ",[206,905,906],{"class":258},"or",[206,908,909],{"class":424}," any",[206,911,677],{"class":258},[206,913,914],{"class":424},"character ",[206,916,917],{"class":212},"not",[206,919,920],{"class":212}," in",[206,922,923],{"class":424}," allowed_characters ",[206,925,926],{"class":212},"for",[206,928,929],{"class":424}," character ",[206,931,932],{"class":212},"in",[206,934,935],{"class":424}," tenant_id",[206,937,791],{"class":258},[206,939,941,943,946,948,950,953,955],{"class":208,"line":940},53,[206,942,797],{"class":212},[206,944,945],{"class":700}," ValueError",[206,947,677],{"class":258},[206,949,418],{"class":258},[206,951,952],{"class":414},"MICROSOFT_TENANT_ID must be a tenant ID or verified domain name",[206,954,418],{"class":258},[206,956,389],{"class":258},[206,958,960],{"class":208,"line":959},54,[206,961,301],{"emptyLinePlaceholder":300},[206,963,965,968,970,972],{"class":208,"line":964},55,[206,966,967],{"class":216},"    request ",[206,969,408],{"class":258},[206,971,289],{"class":424},[206,973,427],{"class":258},[206,975,977,980,983,986,989,992,995],{"class":208,"line":976},56,[206,978,979],{"class":670},"        f",[206,981,982],{"class":414},"\"https:\u002F\u002Flogin.microsoftonline.com\u002F",[206,984,985],{"class":732},"{",[206,987,988],{"class":424},"tenant_id",[206,990,991],{"class":732},"}",[206,993,994],{"class":414},"\u002Foauth2\u002Fv2.0\u002Ftoken\"",[206,996,351],{"class":258},[206,998,1000,1003,1005,1008],{"class":208,"line":999},57,[206,1001,1002],{"class":680},"        data",[206,1004,408],{"class":258},[206,1006,1007],{"class":424},"urlencode",[206,1009,427],{"class":258},[206,1011,1013],{"class":208,"line":1012},58,[206,1014,1015],{"class":258},"            {\n",[206,1017,1019,1021,1024,1026,1028,1030,1033,1035],{"class":208,"line":1018},59,[206,1020,471],{"class":258},[206,1022,1023],{"class":414},"grant_type",[206,1025,418],{"class":258},[206,1027,177],{"class":258},[206,1029,411],{"class":258},[206,1031,1032],{"class":414},"client_credentials",[206,1034,418],{"class":258},[206,1036,351],{"class":258},[206,1038,1040,1042,1045,1047,1049,1051,1053,1055,1057,1059,1062,1064],{"class":208,"line":1039},60,[206,1041,471],{"class":258},[206,1043,1044],{"class":414},"client_id",[206,1046,418],{"class":258},[206,1048,177],{"class":258},[206,1050,859],{"class":424},[206,1052,121],{"class":258},[206,1054,865],{"class":864},[206,1056,697],{"class":258},[206,1058,418],{"class":258},[206,1060,1061],{"class":414},"MICROSOFT_CLIENT_ID",[206,1063,418],{"class":258},[206,1065,1066],{"class":258},"],\n",[206,1068,1070,1072,1075,1077,1079,1081,1083,1085,1087,1089,1092,1094],{"class":208,"line":1069},61,[206,1071,471],{"class":258},[206,1073,1074],{"class":414},"client_secret",[206,1076,418],{"class":258},[206,1078,177],{"class":258},[206,1080,859],{"class":424},[206,1082,121],{"class":258},[206,1084,865],{"class":864},[206,1086,697],{"class":258},[206,1088,418],{"class":258},[206,1090,1091],{"class":414},"MICROSOFT_CLIENT_SECRET",[206,1093,418],{"class":258},[206,1095,1066],{"class":258},[206,1097,1099,1101,1104,1106,1108,1110,1113,1115],{"class":208,"line":1098},62,[206,1100,471],{"class":258},[206,1102,1103],{"class":414},"scope",[206,1105,418],{"class":258},[206,1107,177],{"class":258},[206,1109,411],{"class":258},[206,1111,1112],{"class":414},"https:\u002F\u002Fgraph.microsoft.com\u002F.default",[206,1114,418],{"class":258},[206,1116,351],{"class":258},[206,1118,1120],{"class":208,"line":1119},63,[206,1121,1122],{"class":258},"            }\n",[206,1124,1126,1129,1132],{"class":208,"line":1125},64,[206,1127,1128],{"class":258},"        ).",[206,1130,1131],{"class":424},"encode",[206,1133,1134],{"class":258},"(),\n",[206,1136,1138,1141,1144,1146,1149,1151,1153,1155,1158,1160],{"class":208,"line":1137},65,[206,1139,1140],{"class":680},"        headers",[206,1142,1143],{"class":258},"={",[206,1145,418],{"class":258},[206,1147,1148],{"class":414},"Content-Type",[206,1150,418],{"class":258},[206,1152,177],{"class":258},[206,1154,411],{"class":258},[206,1156,1157],{"class":414},"application\u002Fx-www-form-urlencoded",[206,1159,418],{"class":258},[206,1161,1162],{"class":258},"},\n",[206,1164,1166,1169,1171,1173,1176,1178],{"class":208,"line":1165},66,[206,1167,1168],{"class":680},"        method",[206,1170,408],{"class":258},[206,1172,418],{"class":258},[206,1174,1175],{"class":414},"POST",[206,1177,418],{"class":258},[206,1179,351],{"class":258},[206,1181,1183],{"class":208,"line":1182},67,[206,1184,1185],{"class":258},"    )\n",[206,1187,1189,1192,1194,1196,1198,1200,1203,1206,1208,1210,1213,1215],{"class":208,"line":1188},68,[206,1190,1191],{"class":216},"    token ",[206,1193,408],{"class":258},[206,1195,674],{"class":424},[206,1197,677],{"class":258},[206,1199,681],{"class":424},[206,1201,1202],{"class":258},").",[206,1204,1205],{"class":424},"get",[206,1207,677],{"class":258},[206,1209,418],{"class":258},[206,1211,1212],{"class":414},"access_token",[206,1214,418],{"class":258},[206,1216,389],{"class":258},[206,1218,1220,1222,1224,1226,1228,1231,1233,1235,1237,1240,1242,1245],{"class":208,"line":1219},69,[206,1221,773],{"class":212},[206,1223,776],{"class":258},[206,1225,779],{"class":424},[206,1227,677],{"class":258},[206,1229,1230],{"class":424},"token",[206,1232,269],{"class":258},[206,1234,846],{"class":700},[206,1236,688],{"class":258},[206,1238,1239],{"class":258}," or",[206,1241,776],{"class":258},[206,1243,1244],{"class":216}," token",[206,1246,744],{"class":258},[206,1248,1250,1252,1254,1256,1258,1261,1263],{"class":208,"line":1249},70,[206,1251,797],{"class":212},[206,1253,800],{"class":700},[206,1255,677],{"class":258},[206,1257,418],{"class":258},[206,1259,1260],{"class":414},"Microsoft identity platform returned no access token",[206,1262,418],{"class":258},[206,1264,389],{"class":258},[206,1266,1268,1270],{"class":208,"line":1267},71,[206,1269,817],{"class":212},[206,1271,1272],{"class":216}," token\n",[206,1274,1276],{"class":208,"line":1275},72,[206,1277,301],{"emptyLinePlaceholder":300},[206,1279,1281],{"class":208,"line":1280},73,[206,1282,301],{"emptyLinePlaceholder":300},[206,1284,1286,1288,1291,1293,1296,1298,1300,1302,1305,1307,1309,1311,1313,1316,1318,1321,1323,1326,1328,1330,1332,1334,1337,1339,1342],{"class":208,"line":1285},74,[206,1287,671],{"class":670},[206,1289,1290],{"class":424}," request_graph_users",[206,1292,677],{"class":258},[206,1294,1295],{"class":680},"url",[206,1297,177],{"class":258},[206,1299,846],{"class":700},[206,1301,269],{"class":258},[206,1303,1304],{"class":680}," access_token",[206,1306,177],{"class":258},[206,1308,846],{"class":700},[206,1310,688],{"class":258},[206,1312,691],{"class":258},[206,1314,1315],{"class":216}," tuple",[206,1317,697],{"class":258},[206,1319,1320],{"class":216},"list",[206,1322,697],{"class":258},[206,1324,1325],{"class":216},"dict",[206,1327,697],{"class":258},[206,1329,701],{"class":700},[206,1331,269],{"class":258},[206,1333,706],{"class":216},[206,1335,1336],{"class":258},"]],",[206,1338,846],{"class":700},[206,1340,1341],{"class":258}," |",[206,1343,1344],{"class":258}," None]:\n",[206,1346,1348,1351,1353,1356,1358,1360],{"class":208,"line":1347},75,[206,1349,1350],{"class":216},"    parsed_url ",[206,1352,408],{"class":258},[206,1354,1355],{"class":424}," urlsplit",[206,1357,677],{"class":258},[206,1359,1295],{"class":424},[206,1361,389],{"class":258},[206,1363,1365,1367,1370,1372,1375,1378,1380,1383,1385,1387,1389,1391,1394,1396,1398,1401,1403],{"class":208,"line":1364},76,[206,1366,773],{"class":212},[206,1368,1369],{"class":216}," parsed_url",[206,1371,121],{"class":258},[206,1373,1374],{"class":864},"scheme",[206,1376,1377],{"class":258}," !=",[206,1379,411],{"class":258},[206,1381,1382],{"class":414},"https",[206,1384,418],{"class":258},[206,1386,1239],{"class":258},[206,1388,1369],{"class":216},[206,1390,121],{"class":258},[206,1392,1393],{"class":864},"hostname",[206,1395,1377],{"class":258},[206,1397,411],{"class":258},[206,1399,1400],{"class":414},"graph.microsoft.com",[206,1402,418],{"class":258},[206,1404,744],{"class":258},[206,1406,1408,1410,1412,1414,1416,1419,1421],{"class":208,"line":1407},77,[206,1409,797],{"class":212},[206,1411,800],{"class":700},[206,1413,677],{"class":258},[206,1415,418],{"class":258},[206,1417,1418],{"class":414},"Microsoft Graph returned an invalid pagination URL",[206,1420,418],{"class":258},[206,1422,389],{"class":258},[206,1424,1426],{"class":208,"line":1425},78,[206,1427,301],{"emptyLinePlaceholder":300},[206,1429,1431,1434,1436,1438],{"class":208,"line":1430},79,[206,1432,1433],{"class":216},"    payload ",[206,1435,408],{"class":258},[206,1437,674],{"class":424},[206,1439,427],{"class":258},[206,1441,1443,1446],{"class":208,"line":1442},80,[206,1444,1445],{"class":424},"        Request",[206,1447,427],{"class":258},[206,1449,1451,1454],{"class":208,"line":1450},81,[206,1452,1453],{"class":424},"            url",[206,1455,351],{"class":258},[206,1457,1459,1462],{"class":208,"line":1458},82,[206,1460,1461],{"class":680},"            headers",[206,1463,1464],{"class":258},"={\n",[206,1466,1468,1470,1473,1475,1477,1479,1482,1484],{"class":208,"line":1467},83,[206,1469,471],{"class":258},[206,1471,1472],{"class":414},"Accept",[206,1474,418],{"class":258},[206,1476,177],{"class":258},[206,1478,411],{"class":258},[206,1480,1481],{"class":414},"application\u002Fjson",[206,1483,418],{"class":258},[206,1485,351],{"class":258},[206,1487,1489,1491,1494,1496,1498,1501,1504,1506,1508,1510,1512],{"class":208,"line":1488},84,[206,1490,471],{"class":258},[206,1492,1493],{"class":414},"Authorization",[206,1495,418],{"class":258},[206,1497,177],{"class":258},[206,1499,1500],{"class":670}," f",[206,1502,1503],{"class":414},"\"Bearer ",[206,1505,985],{"class":732},[206,1507,1212],{"class":424},[206,1509,991],{"class":732},[206,1511,418],{"class":414},[206,1513,351],{"class":258},[206,1515,1517],{"class":208,"line":1516},85,[206,1518,1519],{"class":258},"            },\n",[206,1521,1523],{"class":208,"line":1522},86,[206,1524,1525],{"class":258},"        )\n",[206,1527,1529],{"class":208,"line":1528},87,[206,1530,1185],{"class":258},[206,1532,1534,1537,1539,1542,1544,1546,1548,1550,1553,1555],{"class":208,"line":1533},88,[206,1535,1536],{"class":216},"    users ",[206,1538,408],{"class":258},[206,1540,1541],{"class":216}," payload",[206,1543,121],{"class":258},[206,1545,1205],{"class":424},[206,1547,677],{"class":258},[206,1549,418],{"class":258},[206,1551,1552],{"class":414},"value",[206,1554,418],{"class":258},[206,1556,389],{"class":258},[206,1558,1560,1562,1564,1566,1568,1571,1573,1576,1578,1580,1582,1585,1587,1590,1592,1595,1597,1599,1601,1604,1607,1609,1612],{"class":208,"line":1559},89,[206,1561,773],{"class":212},[206,1563,776],{"class":258},[206,1565,779],{"class":424},[206,1567,677],{"class":258},[206,1569,1570],{"class":424},"users",[206,1572,269],{"class":258},[206,1574,1575],{"class":700}," list",[206,1577,688],{"class":258},[206,1579,1239],{"class":258},[206,1581,776],{"class":258},[206,1583,1584],{"class":424}," all",[206,1586,677],{"class":258},[206,1588,1589],{"class":424},"isinstance",[206,1591,677],{"class":258},[206,1593,1594],{"class":424},"user",[206,1596,269],{"class":258},[206,1598,694],{"class":700},[206,1600,688],{"class":258},[206,1602,1603],{"class":212}," for",[206,1605,1606],{"class":424}," user ",[206,1608,932],{"class":212},[206,1610,1611],{"class":424}," users",[206,1613,791],{"class":258},[206,1615,1617,1619,1621,1623,1625,1628,1630],{"class":208,"line":1616},90,[206,1618,797],{"class":212},[206,1620,800],{"class":700},[206,1622,677],{"class":258},[206,1624,418],{"class":258},[206,1626,1627],{"class":414},"Microsoft Graph returned an invalid users response",[206,1629,418],{"class":258},[206,1631,389],{"class":258},[206,1633,1635],{"class":208,"line":1634},91,[206,1636,301],{"emptyLinePlaceholder":300},[206,1638,1640,1643,1645,1647,1649,1651,1653,1655,1658,1660],{"class":208,"line":1639},92,[206,1641,1642],{"class":216},"    next_url ",[206,1644,408],{"class":258},[206,1646,1541],{"class":216},[206,1648,121],{"class":258},[206,1650,1205],{"class":424},[206,1652,677],{"class":258},[206,1654,418],{"class":258},[206,1656,1657],{"class":414},"@odata.nextLink",[206,1659,418],{"class":258},[206,1661,389],{"class":258},[206,1663,1665,1667,1670,1673,1675,1678,1681,1683,1685,1687,1690,1692,1694],{"class":208,"line":1664},93,[206,1666,773],{"class":212},[206,1668,1669],{"class":216}," next_url ",[206,1671,1672],{"class":258},"is",[206,1674,776],{"class":258},[206,1676,1677],{"class":258}," None",[206,1679,1680],{"class":258}," and",[206,1682,776],{"class":258},[206,1684,779],{"class":424},[206,1686,677],{"class":258},[206,1688,1689],{"class":424},"next_url",[206,1691,269],{"class":258},[206,1693,846],{"class":700},[206,1695,791],{"class":258},[206,1697,1699,1701,1703,1705,1707,1709,1711],{"class":208,"line":1698},94,[206,1700,797],{"class":212},[206,1702,800],{"class":700},[206,1704,677],{"class":258},[206,1706,418],{"class":258},[206,1708,1418],{"class":414},[206,1710,418],{"class":258},[206,1712,389],{"class":258},[206,1714,1716,1718,1720,1722],{"class":208,"line":1715},95,[206,1717,817],{"class":212},[206,1719,1611],{"class":216},[206,1721,269],{"class":258},[206,1723,1724],{"class":216}," next_url\n",[206,1726,1728],{"class":208,"line":1727},96,[206,1729,301],{"emptyLinePlaceholder":300},[206,1731,1733],{"class":208,"line":1732},97,[206,1734,301],{"emptyLinePlaceholder":300},[206,1736,1738,1740,1743,1745,1748,1750,1752,1754,1756,1758,1760,1763,1766,1768,1770,1772,1774,1776],{"class":208,"line":1737},98,[206,1739,671],{"class":670},[206,1741,1742],{"class":424}," required_string",[206,1744,677],{"class":258},[206,1746,1747],{"class":680},"source",[206,1749,177],{"class":258},[206,1751,694],{"class":216},[206,1753,697],{"class":258},[206,1755,701],{"class":700},[206,1757,269],{"class":258},[206,1759,706],{"class":216},[206,1761,1762],{"class":258},"],",[206,1764,1765],{"class":680}," field",[206,1767,177],{"class":258},[206,1769,846],{"class":700},[206,1771,688],{"class":258},[206,1773,691],{"class":258},[206,1775,846],{"class":700},[206,1777,744],{"class":258},[206,1779,1781,1784,1786,1789,1791,1793,1795,1798],{"class":208,"line":1780},99,[206,1782,1783],{"class":216},"    value ",[206,1785,408],{"class":258},[206,1787,1788],{"class":216}," source",[206,1790,121],{"class":258},[206,1792,1205],{"class":424},[206,1794,677],{"class":258},[206,1796,1797],{"class":424},"field",[206,1799,389],{"class":258},[206,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1826],{"class":208,"line":1802},100,[206,1804,773],{"class":212},[206,1806,776],{"class":258},[206,1808,779],{"class":424},[206,1810,677],{"class":258},[206,1812,1552],{"class":424},[206,1814,269],{"class":258},[206,1816,846],{"class":700},[206,1818,688],{"class":258},[206,1820,1239],{"class":258},[206,1822,776],{"class":258},[206,1824,1825],{"class":216}," value",[206,1827,744],{"class":258},[206,1829,1831,1833,1835,1837,1840,1843,1845,1847,1849,1851],{"class":208,"line":1830},101,[206,1832,797],{"class":212},[206,1834,800],{"class":700},[206,1836,677],{"class":258},[206,1838,1839],{"class":670},"f",[206,1841,1842],{"class":414},"\"Microsoft Graph user is missing ",[206,1844,985],{"class":732},[206,1846,1797],{"class":424},[206,1848,991],{"class":732},[206,1850,418],{"class":414},[206,1852,389],{"class":258},[206,1854,1856,1858],{"class":208,"line":1855},102,[206,1857,817],{"class":212},[206,1859,1860],{"class":216}," value\n",[206,1862,1864],{"class":208,"line":1863},103,[206,1865,301],{"emptyLinePlaceholder":300},[206,1867,1869],{"class":208,"line":1868},104,[206,1870,301],{"emptyLinePlaceholder":300},[206,1872,1874,1876,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911],{"class":208,"line":1873},105,[206,1875,671],{"class":670},[206,1877,1878],{"class":424}," optional_string",[206,1880,677],{"class":258},[206,1882,1747],{"class":680},[206,1884,177],{"class":258},[206,1886,694],{"class":216},[206,1888,697],{"class":258},[206,1890,701],{"class":700},[206,1892,269],{"class":258},[206,1894,706],{"class":216},[206,1896,1762],{"class":258},[206,1898,1765],{"class":680},[206,1900,177],{"class":258},[206,1902,846],{"class":700},[206,1904,688],{"class":258},[206,1906,691],{"class":258},[206,1908,846],{"class":700},[206,1910,1341],{"class":258},[206,1912,1913],{"class":258}," None:\n",[206,1915,1917,1919,1921,1923,1925,1927,1929,1931],{"class":208,"line":1916},106,[206,1918,1783],{"class":216},[206,1920,408],{"class":258},[206,1922,1788],{"class":216},[206,1924,121],{"class":258},[206,1926,1205],{"class":424},[206,1928,677],{"class":258},[206,1930,1797],{"class":424},[206,1932,389],{"class":258},[206,1934,1936,1938,1941,1944,1946,1948,1950,1952,1954,1956,1958,1960,1963],{"class":208,"line":1935},107,[206,1937,817],{"class":212},[206,1939,1940],{"class":216}," value ",[206,1942,1943],{"class":212},"if",[206,1945,779],{"class":424},[206,1947,677],{"class":258},[206,1949,1552],{"class":424},[206,1951,269],{"class":258},[206,1953,846],{"class":700},[206,1955,688],{"class":258},[206,1957,1680],{"class":258},[206,1959,1940],{"class":216},[206,1961,1962],{"class":212},"else",[206,1964,1965],{"class":258}," None\n",[206,1967,1969],{"class":208,"line":1968},108,[206,1970,301],{"emptyLinePlaceholder":300},[206,1972,1974],{"class":208,"line":1973},109,[206,1975,301],{"emptyLinePlaceholder":300},[206,1977,1979,1981,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2015,2017],{"class":208,"line":1978},110,[206,1980,671],{"class":670},[206,1982,1983],{"class":424}," optional_bool",[206,1985,677],{"class":258},[206,1987,1747],{"class":680},[206,1989,177],{"class":258},[206,1991,694],{"class":216},[206,1993,697],{"class":258},[206,1995,701],{"class":700},[206,1997,269],{"class":258},[206,1999,706],{"class":216},[206,2001,1762],{"class":258},[206,2003,1765],{"class":680},[206,2005,177],{"class":258},[206,2007,846],{"class":700},[206,2009,688],{"class":258},[206,2011,691],{"class":258},[206,2013,2014],{"class":700}," bool",[206,2016,1341],{"class":258},[206,2018,1913],{"class":258},[206,2020,2022,2024,2026,2028,2030,2032,2034,2036],{"class":208,"line":2021},111,[206,2023,1783],{"class":216},[206,2025,408],{"class":258},[206,2027,1788],{"class":216},[206,2029,121],{"class":258},[206,2031,1205],{"class":424},[206,2033,677],{"class":258},[206,2035,1797],{"class":424},[206,2037,389],{"class":258},[206,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2062],{"class":208,"line":2040},112,[206,2042,817],{"class":212},[206,2044,1940],{"class":216},[206,2046,1943],{"class":212},[206,2048,779],{"class":424},[206,2050,677],{"class":258},[206,2052,1552],{"class":424},[206,2054,269],{"class":258},[206,2056,2014],{"class":700},[206,2058,688],{"class":258},[206,2060,2061],{"class":212}," else",[206,2063,1965],{"class":258},[206,2065,2067],{"class":208,"line":2066},113,[206,2068,301],{"emptyLinePlaceholder":300},[206,2070,2072],{"class":208,"line":2071},114,[206,2073,301],{"emptyLinePlaceholder":300},[206,2075,2077,2079,2082,2084,2086,2088,2090,2092,2094,2096,2098,2101,2103,2106,2109],{"class":208,"line":2076},115,[206,2078,671],{"class":670},[206,2080,2081],{"class":424}," employee_org_data",[206,2083,677],{"class":258},[206,2085,1594],{"class":680},[206,2087,177],{"class":258},[206,2089,694],{"class":216},[206,2091,697],{"class":258},[206,2093,701],{"class":700},[206,2095,269],{"class":258},[206,2097,706],{"class":216},[206,2099,2100],{"class":258},"])",[206,2102,691],{"class":258},[206,2104,2105],{"class":216}," MicrosoftEmployeeOrgData ",[206,2107,2108],{"class":258},"|",[206,2110,1913],{"class":258},[206,2112,2114,2116,2118,2121,2123,2125,2127,2129,2131,2133],{"class":208,"line":2113},116,[206,2115,1783],{"class":216},[206,2117,408],{"class":258},[206,2119,2120],{"class":216}," user",[206,2122,121],{"class":258},[206,2124,1205],{"class":424},[206,2126,677],{"class":258},[206,2128,418],{"class":258},[206,2130,606],{"class":414},[206,2132,418],{"class":258},[206,2134,389],{"class":258},[206,2136,2138,2140,2142,2144,2146,2148,2150,2152],{"class":208,"line":2137},117,[206,2139,773],{"class":212},[206,2141,776],{"class":258},[206,2143,779],{"class":424},[206,2145,677],{"class":258},[206,2147,1552],{"class":424},[206,2149,269],{"class":258},[206,2151,694],{"class":700},[206,2153,791],{"class":258},[206,2155,2157,2160],{"class":208,"line":2156},118,[206,2158,2159],{"class":212},"        return",[206,2161,1965],{"class":258},[206,2163,2165],{"class":208,"line":2164},119,[206,2166,301],{"emptyLinePlaceholder":300},[206,2168,2170,2173,2175,2177,2179,2181,2183,2185,2188,2190],{"class":208,"line":2169},120,[206,2171,2172],{"class":216},"    division ",[206,2174,408],{"class":258},[206,2176,1878],{"class":424},[206,2178,677],{"class":258},[206,2180,1552],{"class":424},[206,2182,269],{"class":258},[206,2184,411],{"class":258},[206,2186,2187],{"class":414},"division",[206,2189,418],{"class":258},[206,2191,389],{"class":258},[206,2193,2195,2198,2200,2202,2204,2206,2208,2210,2213,2215],{"class":208,"line":2194},121,[206,2196,2197],{"class":216},"    cost_center ",[206,2199,408],{"class":258},[206,2201,1878],{"class":424},[206,2203,677],{"class":258},[206,2205,1552],{"class":424},[206,2207,269],{"class":258},[206,2209,411],{"class":258},[206,2211,2212],{"class":414},"costCenter",[206,2214,418],{"class":258},[206,2216,389],{"class":258},[206,2218,2220,2222,2225,2227,2229,2231,2234,2236],{"class":208,"line":2219},122,[206,2221,773],{"class":212},[206,2223,2224],{"class":216}," division ",[206,2226,1672],{"class":258},[206,2228,1677],{"class":258},[206,2230,1680],{"class":258},[206,2232,2233],{"class":216}," cost_center ",[206,2235,1672],{"class":258},[206,2237,1913],{"class":258},[206,2239,2241,2243],{"class":208,"line":2240},123,[206,2242,2159],{"class":212},[206,2244,1965],{"class":258},[206,2246,2248],{"class":208,"line":2247},124,[206,2249,301],{"emptyLinePlaceholder":300},[206,2251,2253,2255,2258,2260,2262,2264,2266,2268,2271,2273,2276],{"class":208,"line":2252},125,[206,2254,817],{"class":212},[206,2256,2257],{"class":424}," MicrosoftEmployeeOrgData",[206,2259,677],{"class":258},[206,2261,2187],{"class":680},[206,2263,408],{"class":258},[206,2265,2187],{"class":424},[206,2267,269],{"class":258},[206,2269,2270],{"class":680}," cost_center",[206,2272,408],{"class":258},[206,2274,2275],{"class":424},"cost_center",[206,2277,389],{"class":258},[206,2279,2281],{"class":208,"line":2280},126,[206,2282,301],{"emptyLinePlaceholder":300},[206,2284,2286],{"class":208,"line":2285},127,[206,2287,301],{"emptyLinePlaceholder":300},[206,2289,2291,2293,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2319],{"class":208,"line":2290},128,[206,2292,671],{"class":670},[206,2294,2295],{"class":424}," employee_from_graph_user",[206,2297,677],{"class":258},[206,2299,1594],{"class":680},[206,2301,177],{"class":258},[206,2303,694],{"class":216},[206,2305,697],{"class":258},[206,2307,701],{"class":700},[206,2309,269],{"class":258},[206,2311,706],{"class":216},[206,2313,2100],{"class":258},[206,2315,691],{"class":258},[206,2317,2318],{"class":216}," Employee",[206,2320,744],{"class":258},[206,2322,2324,2326,2328],{"class":208,"line":2323},129,[206,2325,817],{"class":212},[206,2327,2318],{"class":424},[206,2329,427],{"class":258},[206,2331,2333,2336,2338,2340],{"class":208,"line":2332},130,[206,2334,2335],{"class":680},"        microsoft",[206,2337,408],{"class":258},[206,2339,112],{"class":424},[206,2341,427],{"class":258},[206,2343,2345,2348,2350,2353,2355,2357,2359,2361,2363,2365],{"class":208,"line":2344},131,[206,2346,2347],{"class":680},"            id",[206,2349,408],{"class":258},[206,2351,2352],{"class":424},"required_string",[206,2354,677],{"class":258},[206,2356,1594],{"class":424},[206,2358,269],{"class":258},[206,2360,411],{"class":258},[206,2362,474],{"class":414},[206,2364,418],{"class":258},[206,2366,2367],{"class":258},"),\n",[206,2369,2371,2374,2376,2378,2380,2382,2384,2386,2388,2390],{"class":208,"line":2370},132,[206,2372,2373],{"class":680},"            display_name",[206,2375,408],{"class":258},[206,2377,2352],{"class":424},[206,2379,677],{"class":258},[206,2381,1594],{"class":424},[206,2383,269],{"class":258},[206,2385,411],{"class":258},[206,2387,486],{"class":414},[206,2389,418],{"class":258},[206,2391,2367],{"class":258},[206,2393,2395,2398,2400,2403,2405,2407,2409,2411,2413,2415],{"class":208,"line":2394},133,[206,2396,2397],{"class":680},"            given_name",[206,2399,408],{"class":258},[206,2401,2402],{"class":424},"optional_string",[206,2404,677],{"class":258},[206,2406,1594],{"class":424},[206,2408,269],{"class":258},[206,2410,411],{"class":258},[206,2412,498],{"class":414},[206,2414,418],{"class":258},[206,2416,2367],{"class":258},[206,2418,2420,2423,2425,2427,2429,2431,2433,2435,2437,2439],{"class":208,"line":2419},134,[206,2421,2422],{"class":680},"            surname",[206,2424,408],{"class":258},[206,2426,2402],{"class":424},[206,2428,677],{"class":258},[206,2430,1594],{"class":424},[206,2432,269],{"class":258},[206,2434,411],{"class":258},[206,2436,510],{"class":414},[206,2438,418],{"class":258},[206,2440,2367],{"class":258},[206,2442,2444,2447,2449,2451,2453,2455,2457,2459,2461,2463],{"class":208,"line":2443},135,[206,2445,2446],{"class":680},"            mail",[206,2448,408],{"class":258},[206,2450,2402],{"class":424},[206,2452,677],{"class":258},[206,2454,1594],{"class":424},[206,2456,269],{"class":258},[206,2458,411],{"class":258},[206,2460,522],{"class":414},[206,2462,418],{"class":258},[206,2464,2367],{"class":258},[206,2466,2468,2471,2473,2475,2477,2479,2481,2483,2485,2487],{"class":208,"line":2467},136,[206,2469,2470],{"class":680},"            user_principal_name",[206,2472,408],{"class":258},[206,2474,2352],{"class":424},[206,2476,677],{"class":258},[206,2478,1594],{"class":424},[206,2480,269],{"class":258},[206,2482,411],{"class":258},[206,2484,534],{"class":414},[206,2486,418],{"class":258},[206,2488,2367],{"class":258},[206,2490,2492,2495,2497,2499,2501,2503,2505,2507,2509,2511],{"class":208,"line":2491},137,[206,2493,2494],{"class":680},"            department",[206,2496,408],{"class":258},[206,2498,2402],{"class":424},[206,2500,677],{"class":258},[206,2502,1594],{"class":424},[206,2504,269],{"class":258},[206,2506,411],{"class":258},[206,2508,546],{"class":414},[206,2510,418],{"class":258},[206,2512,2367],{"class":258},[206,2514,2516,2519,2521,2524,2526,2528,2530,2532,2534,2536],{"class":208,"line":2515},138,[206,2517,2518],{"class":680},"            account_enabled",[206,2520,408],{"class":258},[206,2522,2523],{"class":424},"optional_bool",[206,2525,677],{"class":258},[206,2527,1594],{"class":424},[206,2529,269],{"class":258},[206,2531,411],{"class":258},[206,2533,558],{"class":414},[206,2535,418],{"class":258},[206,2537,2367],{"class":258},[206,2539,2541,2544,2546,2548,2550,2552,2554,2556,2558,2560],{"class":208,"line":2540},139,[206,2542,2543],{"class":680},"            job_title",[206,2545,408],{"class":258},[206,2547,2402],{"class":424},[206,2549,677],{"class":258},[206,2551,1594],{"class":424},[206,2553,269],{"class":258},[206,2555,411],{"class":258},[206,2557,570],{"class":414},[206,2559,418],{"class":258},[206,2561,2367],{"class":258},[206,2563,2565,2568,2570,2572,2574,2576,2578,2580,2582,2584],{"class":208,"line":2564},140,[206,2566,2567],{"class":680},"            user_type",[206,2569,408],{"class":258},[206,2571,2402],{"class":424},[206,2573,677],{"class":258},[206,2575,1594],{"class":424},[206,2577,269],{"class":258},[206,2579,411],{"class":258},[206,2581,582],{"class":414},[206,2583,418],{"class":258},[206,2585,2367],{"class":258},[206,2587,2589,2592,2594,2596,2598,2600,2602,2604,2606,2608],{"class":208,"line":2588},141,[206,2590,2591],{"class":680},"            country",[206,2593,408],{"class":258},[206,2595,2402],{"class":424},[206,2597,677],{"class":258},[206,2599,1594],{"class":424},[206,2601,269],{"class":258},[206,2603,411],{"class":258},[206,2605,594],{"class":414},[206,2607,418],{"class":258},[206,2609,2367],{"class":258},[206,2611,2613,2616,2618,2621,2623,2625],{"class":208,"line":2612},142,[206,2614,2615],{"class":680},"            employee_org_data",[206,2617,408],{"class":258},[206,2619,2620],{"class":424},"employee_org_data",[206,2622,677],{"class":258},[206,2624,1594],{"class":424},[206,2626,2367],{"class":258},[206,2628,2630],{"class":208,"line":2629},143,[206,2631,1525],{"class":258},[206,2633,2635],{"class":208,"line":2634},144,[206,2636,1185],{"class":258},[206,2638,2640],{"class":208,"line":2639},145,[206,2641,301],{"emptyLinePlaceholder":300},[206,2643,2645],{"class":208,"line":2644},146,[206,2646,301],{"emptyLinePlaceholder":300},[206,2648,2650,2653,2656,2659,2661,2663,2666],{"class":208,"line":2649},147,[206,2651,2652],{"class":670},"async",[206,2654,2655],{"class":670}," def",[206,2657,2658],{"class":424}," sync_employees",[206,2660,841],{"class":258},[206,2662,691],{"class":258},[206,2664,2665],{"class":700}," int",[206,2667,744],{"class":258},[206,2669,2671,2674,2676,2679,2682,2684,2687,2689,2692],{"class":208,"line":2670},148,[206,2672,2673],{"class":216},"    graph_token ",[206,2675,408],{"class":258},[206,2677,2678],{"class":212}," await",[206,2680,2681],{"class":216}," asyncio",[206,2683,121],{"class":258},[206,2685,2686],{"class":424},"to_thread",[206,2688,677],{"class":258},[206,2690,2691],{"class":424},"request_graph_token",[206,2693,389],{"class":258},[206,2695,2697,2700,2702,2705],{"class":208,"line":2696},149,[206,2698,2699],{"class":216},"    options ",[206,2701,408],{"class":258},[206,2703,2704],{"class":424}," SyncApiClientOptions",[206,2706,427],{"class":258},[206,2708,2710,2713,2715,2718,2720,2722,2724,2726,2729,2731],{"class":208,"line":2709},150,[206,2711,2712],{"class":680},"        endpoint",[206,2714,408],{"class":258},[206,2716,2717],{"class":424},"os",[206,2719,121],{"class":258},[206,2721,865],{"class":864},[206,2723,697],{"class":258},[206,2725,418],{"class":258},[206,2727,2728],{"class":414},"VIIO_SYNC_API_ENDPOINT",[206,2730,418],{"class":258},[206,2732,1066],{"class":258},[206,2734,2736,2739,2741,2744,2746,2749,2751,2753,2755,2757,2759,2761,2764,2766],{"class":208,"line":2735},151,[206,2737,2738],{"class":680},"        authentication",[206,2740,408],{"class":258},[206,2742,2743],{"class":424},"SyncApiAuthentication",[206,2745,121],{"class":258},[206,2747,2748],{"class":424},"api_key",[206,2750,677],{"class":258},[206,2752,2717],{"class":424},[206,2754,121],{"class":258},[206,2756,865],{"class":864},[206,2758,697],{"class":258},[206,2760,418],{"class":258},[206,2762,2763],{"class":414},"VIIO_SYNC_API_KEY",[206,2765,418],{"class":258},[206,2767,2768],{"class":258},"]),\n",[206,2770,2772],{"class":208,"line":2771},152,[206,2773,1185],{"class":258},[206,2775,2777],{"class":208,"line":2776},153,[206,2778,301],{"emptyLinePlaceholder":300},[206,2780,2782,2785,2788,2790,2792,2795,2797,2799,2802],{"class":208,"line":2781},154,[206,2783,2784],{"class":212},"    async",[206,2786,2787],{"class":212}," with",[206,2789,319],{"class":424},[206,2791,677],{"class":258},[206,2793,2794],{"class":424},"options",[206,2796,688],{"class":258},[206,2798,738],{"class":212},[206,2800,2801],{"class":216}," client",[206,2803,744],{"class":258},[206,2805,2807,2810,2812,2814,2816,2818,2821,2823,2825,2827,2829,2831,2833,2836,2838],{"class":208,"line":2806},155,[206,2808,2809],{"class":216},"        batch ",[206,2811,408],{"class":258},[206,2813,2678],{"class":212},[206,2815,2801],{"class":216},[206,2817,121],{"class":258},[206,2819,2820],{"class":424},"start_batch",[206,2822,677],{"class":258},[206,2824,2717],{"class":424},[206,2826,121],{"class":258},[206,2828,865],{"class":864},[206,2830,697],{"class":258},[206,2832,418],{"class":258},[206,2834,2835],{"class":414},"VIIO_DIRECT_INTEGRATION_INSTALLATION_ID",[206,2837,418],{"class":258},[206,2839,2840],{"class":258},"])\n",[206,2842,2844,2847,2849],{"class":208,"line":2843},156,[206,2845,2846],{"class":216},"        employee_count ",[206,2848,408],{"class":258},[206,2850,2851],{"class":732}," 0\n",[206,2853,2855,2858,2860,2862,2864,2866,2869],{"class":208,"line":2854},157,[206,2856,2857],{"class":216},"        next_url",[206,2859,177],{"class":258},[206,2861,846],{"class":700},[206,2863,1341],{"class":258},[206,2865,1677],{"class":258},[206,2867,2868],{"class":258}," =",[206,2870,2871],{"class":216}," GRAPH_USERS_URL\n",[206,2873,2875,2878],{"class":208,"line":2874},158,[206,2876,2877],{"class":212},"        try",[206,2879,744],{"class":258},[206,2881,2883,2886,2888,2890,2892],{"class":208,"line":2882},159,[206,2884,2885],{"class":212},"            while",[206,2887,1669],{"class":216},[206,2889,1672],{"class":258},[206,2891,776],{"class":258},[206,2893,1913],{"class":258},[206,2895,2897,2900,2902,2904,2906,2908,2910,2912,2914,2916,2919,2921,2924,2926,2929],{"class":208,"line":2896},160,[206,2898,2899],{"class":216},"                users",[206,2901,269],{"class":258},[206,2903,1669],{"class":216},[206,2905,408],{"class":258},[206,2907,2678],{"class":212},[206,2909,2681],{"class":216},[206,2911,121],{"class":258},[206,2913,2686],{"class":424},[206,2915,677],{"class":258},[206,2917,2918],{"class":424},"request_graph_users",[206,2920,269],{"class":258},[206,2922,2923],{"class":424}," next_url",[206,2925,269],{"class":258},[206,2927,2928],{"class":424}," graph_token",[206,2930,389],{"class":258},[206,2932,2934,2937,2939],{"class":208,"line":2933},161,[206,2935,2936],{"class":212},"                if",[206,2938,1611],{"class":216},[206,2940,744],{"class":258},[206,2942,2944,2947,2949,2952,2955,2957,2959,2961,2963,2965,2967,2969],{"class":208,"line":2943},162,[206,2945,2946],{"class":216},"                    employees ",[206,2948,408],{"class":258},[206,2950,2951],{"class":258}," [",[206,2953,2954],{"class":424},"employee_from_graph_user",[206,2956,677],{"class":258},[206,2958,1594],{"class":424},[206,2960,688],{"class":258},[206,2962,1603],{"class":212},[206,2964,1606],{"class":216},[206,2966,932],{"class":212},[206,2968,1611],{"class":216},[206,2970,877],{"class":258},[206,2972,2974,2977,2980,2982,2985,2987,2990,2992,2995,2997,3000,3002,3005,3007,3009],{"class":208,"line":2973},163,[206,2975,2976],{"class":212},"                    await",[206,2978,2979],{"class":216}," batch",[206,2981,121],{"class":258},[206,2983,2984],{"class":424},"write",[206,2986,677],{"class":258},[206,2988,2989],{"class":424},"SyncRecordsRequest",[206,2991,677],{"class":258},[206,2993,2994],{"class":680},"employees",[206,2996,408],{"class":258},[206,2998,2999],{"class":424},"EmployeeRecords",[206,3001,677],{"class":258},[206,3003,3004],{"class":680},"records",[206,3006,408],{"class":258},[206,3008,2994],{"class":424},[206,3010,3011],{"class":258},")))\n",[206,3013,3015,3018,3021,3024,3026,3028],{"class":208,"line":3014},164,[206,3016,3017],{"class":216},"                    employee_count ",[206,3019,3020],{"class":258},"+=",[206,3022,3023],{"class":424}," len",[206,3025,677],{"class":258},[206,3027,2994],{"class":424},[206,3029,389],{"class":258},[206,3031,3033],{"class":208,"line":3032},165,[206,3034,301],{"emptyLinePlaceholder":300},[206,3036,3038,3041,3044,3047,3050],{"class":208,"line":3037},166,[206,3039,3040],{"class":212},"            if",[206,3042,3043],{"class":216}," employee_count ",[206,3045,3046],{"class":258},"==",[206,3048,3049],{"class":732}," 0",[206,3051,744],{"class":258},[206,3053,3055,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076],{"class":208,"line":3054},167,[206,3056,3057],{"class":212},"                await",[206,3059,2979],{"class":216},[206,3061,121],{"class":258},[206,3063,2984],{"class":424},[206,3065,677],{"class":258},[206,3067,2989],{"class":424},[206,3069,677],{"class":258},[206,3071,2994],{"class":680},[206,3073,408],{"class":258},[206,3075,2999],{"class":424},[206,3077,3078],{"class":258},"()))\n",[206,3080,3082,3085,3087,3089,3092],{"class":208,"line":3081},168,[206,3083,3084],{"class":212},"            await",[206,3086,2979],{"class":216},[206,3088,121],{"class":258},[206,3090,3091],{"class":424},"complete",[206,3093,3094],{"class":258},"()\n",[206,3096,3098,3101,3104],{"class":208,"line":3097},169,[206,3099,3100],{"class":212},"        except",[206,3102,3103],{"class":700}," BaseException",[206,3105,744],{"class":258},[206,3107,3109,3111,3113,3115,3118],{"class":208,"line":3108},170,[206,3110,3084],{"class":212},[206,3112,2979],{"class":216},[206,3114,121],{"class":258},[206,3116,3117],{"class":424},"abort",[206,3119,3094],{"class":258},[206,3121,3123],{"class":208,"line":3122},171,[206,3124,3125],{"class":212},"            raise\n",[206,3127,3129,3131],{"class":208,"line":3128},172,[206,3130,2159],{"class":212},[206,3132,3133],{"class":216}," employee_count\n",[206,3135,3137],{"class":208,"line":3136},173,[206,3138,301],{"emptyLinePlaceholder":300},[206,3140,3142],{"class":208,"line":3141},174,[206,3143,301],{"emptyLinePlaceholder":300},[206,3145,3147,3149,3152,3154,3157,3159,3161,3163,3165,3167,3169,3171,3174,3176,3179,3181,3183,3185,3187,3189,3191,3193],{"class":208,"line":3146},175,[206,3148,671],{"class":670},[206,3150,3151],{"class":424}," lambda_handler",[206,3153,677],{"class":258},[206,3155,3156],{"class":680},"event",[206,3158,177],{"class":258},[206,3160,694],{"class":216},[206,3162,697],{"class":258},[206,3164,701],{"class":700},[206,3166,269],{"class":258},[206,3168,706],{"class":216},[206,3170,1762],{"class":258},[206,3172,3173],{"class":680}," context",[206,3175,177],{"class":258},[206,3177,3178],{"class":700}," object",[206,3180,688],{"class":258},[206,3182,691],{"class":258},[206,3184,694],{"class":216},[206,3186,697],{"class":258},[206,3188,701],{"class":700},[206,3190,269],{"class":258},[206,3192,706],{"class":216},[206,3194,709],{"class":258},[206,3196,3198,3201,3204,3206],{"class":208,"line":3197},176,[206,3199,3200],{"class":212},"    del",[206,3202,3203],{"class":216}," event",[206,3205,269],{"class":258},[206,3207,3208],{"class":216}," context\n",[206,3210,3212,3215,3217,3219,3221,3224,3226,3229],{"class":208,"line":3211},177,[206,3213,3214],{"class":216},"    employee_count ",[206,3216,408],{"class":258},[206,3218,2681],{"class":216},[206,3220,121],{"class":258},[206,3222,3223],{"class":424},"run",[206,3225,677],{"class":258},[206,3227,3228],{"class":424},"sync_employees",[206,3230,3231],{"class":258},"())\n",[206,3233,3235,3237,3240,3242,3245,3247,3249,3252,3254,3257,3259,3261,3264],{"class":208,"line":3234},178,[206,3236,817],{"class":212},[206,3238,3239],{"class":258}," {",[206,3241,418],{"class":258},[206,3243,3244],{"class":414},"ok",[206,3246,418],{"class":258},[206,3248,177],{"class":258},[206,3250,3251],{"class":258}," True,",[206,3253,411],{"class":258},[206,3255,3256],{"class":414},"employee_count",[206,3258,418],{"class":258},[206,3260,177],{"class":258},[206,3262,3263],{"class":216}," employee_count",[206,3265,3266],{"class":258},"}\n",[106,3268,3269,3270,3273,3274,3276],{},"Each Graph page becomes one ",[110,3271,3272],{},"batch.write"," call. If Microsoft Graph returns no users, the function sends a present empty ",[110,3275,2999],{}," wrapper so Viio records an intentionally empty employee snapshot.",[106,3278,3279],{},"The client is created and closed inside the invocation's event loop. This prevents a reused Lambda execution environment from retaining a gRPC AsyncIO channel bound to an earlier event loop.",[106,3281,3282,3283,3288],{},"The ",[115,3284,3287],{"href":3285,"rel":3286},"https:\u002F\u002Fgithub.com\u002Fviio-io\u002Fintegration-domain\u002Fblob\u002Fmain\u002Fsdk\u002Fpython\u002Fexamples\u002Faws_lambda.py",[119],"complete maintained handler"," also maps Microsoft creation and deletion timestamps and employee organization data.",[137,3290,3292],{"id":3291},"environment-variables","Environment Variables",[106,3294,3295],{},"Configure:",[3297,3298,3299,3312],"table",{},[3300,3301,3302],"thead",{},[3303,3304,3305,3309],"tr",{},[3306,3307,3308],"th",{},"Variable",[3306,3310,3311],{},"Description",[3313,3314,3315,3325,3334,3343,3354,3365],"tbody",{},[3303,3316,3317,3322],{},[3318,3319,3320],"td",{},[110,3321,872],{},[3318,3323,3324],{},"Microsoft Entra tenant ID or verified domain",[3303,3326,3327,3331],{},[3318,3328,3329],{},[110,3330,1061],{},[3318,3332,3333],{},"Entra application client ID",[3303,3335,3336,3340],{},[3318,3337,3338],{},[110,3339,1091],{},[3318,3341,3342],{},"Entra application client secret",[3303,3344,3345,3349],{},[3318,3346,3347],{},[110,3348,2728],{},[3318,3350,3351],{},[110,3352,3353],{},"https:\u002F\u002Fsync.viio.io",[3303,3355,3356,3360],{},[3318,3357,3358],{},[110,3359,2763],{},[3318,3361,3362,3363],{},"Viio API key with ",[110,3364,159],{},[3303,3366,3367,3371],{},[3318,3368,3369],{},[110,3370,2835],{},[3318,3372,3373],{},"Installation that receives the employee snapshot",[106,3375,3376],{},"Supply secret values through your secret-management system. Do not commit them to the deployment package or template.",[137,3378,3380],{"id":3379},"schedule-with-aws-sam","Schedule with AWS SAM",[106,3382,3383,3384,3389],{},"The maintained ",[115,3385,3388],{"href":3386,"rel":3387},"https:\u002F\u002Fgithub.com\u002Fviio-io\u002Fintegration-domain\u002Fblob\u002Fmain\u002Fsdk\u002Fpython\u002Fexamples\u002Ftemplate.yaml",[119],"AWS SAM template"," configures a Python 3.11 Arm64 function with a 15-minute timeout and invokes it nightly through Amazon EventBridge Scheduler:",[179,3391,3395],{"className":3392,"code":3393,"language":3394,"meta":185,"style":185},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Resources:\n  EmployeeSyncFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      Architectures:\n        - arm64\n      CodeUri: .\n      Handler: aws_lambda.lambda_handler\n      Runtime: python3.11\n      MemorySize: 512\n      Timeout: 900\n      Environment:\n        Variables:\n          MICROSOFT_TENANT_ID: !Ref MicrosoftTenantId\n          MICROSOFT_CLIENT_ID: !Ref MicrosoftClientId\n          MICROSOFT_CLIENT_SECRET: !Ref MicrosoftClientSecret\n          VIIO_SYNC_API_ENDPOINT: !Ref ViioSyncApiEndpoint\n          VIIO_SYNC_API_KEY: !Ref ViioSyncApiKey\n          VIIO_DIRECT_INTEGRATION_INSTALLATION_ID: !Ref ViioDirectIntegrationInstallationId\n      Events:\n        NightlyEmployeeSync:\n          Type: ScheduleV2\n          Properties:\n            ScheduleExpression: cron(0 2 * * ? *)\n            ScheduleExpressionTimezone: UTC\n","yaml",[110,3396,3397,3402,3407,3412,3417,3422,3427,3432,3437,3442,3447,3452,3457,3462,3467,3472,3477,3482,3487,3492,3497,3502,3507,3512,3517],{"__ignoreMap":185},[206,3398,3399],{"class":208,"line":209},[206,3400,3401],{},"Resources:\n",[206,3403,3404],{"class":208,"line":220},[206,3405,3406],{},"  EmployeeSyncFunction:\n",[206,3408,3409],{"class":208,"line":228},[206,3410,3411],{},"    Type: AWS::Serverless::Function\n",[206,3413,3414],{"class":208,"line":236},[206,3415,3416],{},"    Properties:\n",[206,3418,3419],{"class":208,"line":250},[206,3420,3421],{},"      Architectures:\n",[206,3423,3424],{"class":208,"line":275},[206,3425,3426],{},"        - arm64\n",[206,3428,3429],{"class":208,"line":297},[206,3430,3431],{},"      CodeUri: .\n",[206,3433,3434],{"class":208,"line":304},[206,3435,3436],{},"      Handler: aws_lambda.lambda_handler\n",[206,3438,3439],{"class":208,"line":327},[206,3440,3441],{},"      Runtime: python3.11\n",[206,3443,3444],{"class":208,"line":345},[206,3445,3446],{},"      MemorySize: 512\n",[206,3448,3449],{"class":208,"line":354},[206,3450,3451],{},"      Timeout: 900\n",[206,3453,3454],{"class":208,"line":362},[206,3455,3456],{},"      Environment:\n",[206,3458,3459],{"class":208,"line":370},[206,3460,3461],{},"        Variables:\n",[206,3463,3464],{"class":208,"line":378},[206,3465,3466],{},"          MICROSOFT_TENANT_ID: !Ref MicrosoftTenantId\n",[206,3468,3469],{"class":208,"line":386},[206,3470,3471],{},"          MICROSOFT_CLIENT_ID: !Ref MicrosoftClientId\n",[206,3473,3474],{"class":208,"line":392},[206,3475,3476],{},"          MICROSOFT_CLIENT_SECRET: !Ref MicrosoftClientSecret\n",[206,3478,3479],{"class":208,"line":397},[206,3480,3481],{},"          VIIO_SYNC_API_ENDPOINT: !Ref ViioSyncApiEndpoint\n",[206,3483,3484],{"class":208,"line":402},[206,3485,3486],{},"          VIIO_SYNC_API_KEY: !Ref ViioSyncApiKey\n",[206,3488,3489],{"class":208,"line":430},[206,3490,3491],{},"          VIIO_DIRECT_INTEGRATION_INSTALLATION_ID: !Ref ViioDirectIntegrationInstallationId\n",[206,3493,3494],{"class":208,"line":436},[206,3495,3496],{},"      Events:\n",[206,3498,3499],{"class":208,"line":462},[206,3500,3501],{},"        NightlyEmployeeSync:\n",[206,3503,3504],{"class":208,"line":468},[206,3505,3506],{},"          Type: ScheduleV2\n",[206,3508,3509],{"class":208,"line":481},[206,3510,3511],{},"          Properties:\n",[206,3513,3514],{"class":208,"line":493},[206,3515,3516],{},"            ScheduleExpression: cron(0 2 * * ? *)\n",[206,3518,3519],{"class":208,"line":505},[206,3520,3521],{},"            ScheduleExpressionTimezone: UTC\n",[137,3523,3525],{"id":3524},"package-native-dependencies","Package Native Dependencies",[106,3527,3528,3531],{},[110,3529,3530],{},"grpcio"," contains native code. When building an Arm64 Lambda ZIP or layer on another operating system, install the matching Linux wheel:",[179,3533,3537],{"className":3534,"code":3535,"language":3536,"meta":185,"style":185},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python -m pip install \\\n  --platform manylinux2014_aarch64 \\\n  --implementation cp \\\n  --python-version 3.11 \\\n  --only-binary=:all: \\\n  --target package \\\n  viio-sync-api-sdk\n","bash",[110,3538,3539,3555,3565,3575,3585,3592,3602],{"__ignoreMap":185},[206,3540,3541,3543,3546,3549,3552],{"class":208,"line":209},[206,3542,202],{"class":700},[206,3544,3545],{"class":414}," -m",[206,3547,3548],{"class":414}," pip",[206,3550,3551],{"class":414}," install",[206,3553,3554],{"class":216}," \\\n",[206,3556,3557,3560,3563],{"class":208,"line":220},[206,3558,3559],{"class":414},"  --platform",[206,3561,3562],{"class":414}," manylinux2014_aarch64",[206,3564,3554],{"class":216},[206,3566,3567,3570,3573],{"class":208,"line":228},[206,3568,3569],{"class":414},"  --implementation",[206,3571,3572],{"class":414}," cp",[206,3574,3554],{"class":216},[206,3576,3577,3580,3583],{"class":208,"line":236},[206,3578,3579],{"class":414},"  --python-version",[206,3581,3582],{"class":732}," 3.11",[206,3584,3554],{"class":216},[206,3586,3587,3590],{"class":208,"line":250},[206,3588,3589],{"class":414},"  --only-binary=:all:",[206,3591,3554],{"class":216},[206,3593,3594,3597,3600],{"class":208,"line":275},[206,3595,3596],{"class":414},"  --target",[206,3598,3599],{"class":414}," package",[206,3601,3554],{"class":216},[206,3603,3604],{"class":208,"line":297},[206,3605,3606],{"class":414},"  viio-sync-api-sdk\n",[106,3608,3609,3610,3613,3614,3617],{},"Replace ",[110,3611,3612],{},"3.11"," with the target Lambda runtime version. For an x86-64 function, use ",[110,3615,3616],{},"manylinux2014_x86_64",". Python Lambda container images can install the package normally.",[3619,3620],"read-more",{"title":3621,"to":61},"Build a complete SDK sync",[3619,3623],{"title":3624,"to":3625},"Browse employee models","\u002Fsync-api\u002Fapi-reference\u002Fmodels#employees",[3627,3628,3629],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":185,"searchDepth":209,"depth":220,"links":3631},[3632,3633,3634,3635,3636],{"id":139,"depth":220,"text":140},{"id":190,"depth":220,"text":191},{"id":3291,"depth":220,"text":3292},{"id":3379,"depth":220,"text":3380},{"id":3524,"depth":220,"text":3525},"2026-08-06","2026-07-31","Run a scheduled Microsoft Entra employee sync from AWS Lambda with the Viio Python SDK.","md",null,{},{"title":3644,"description":3645},"Viio Sync API from AWS Lambda with Python","Build a scheduled AWS Lambda function that pages Microsoft Graph users and sends a complete employee snapshot to Viio.","3.sync-api\u002F6.aws-lambda-python","lkwaEd6FkwAmsK1Vm8MoyiplJ8MPNhCexaNVQJIiQhQ",[3649,3651],{"title":60,"path":61,"stem":62,"description":3650,"children":-1},"Install an SDK and safely start, stream, complete, retry, and abort Sync API batches.",{"title":77,"path":73,"stem":74,"description":3652,"children":-1},"Connect Claude, ChatGPT, Cursor, Microsoft Copilot, and other AI clients to your Viio workspace.",1787319043770]